Entity Frameworkコアで移行を作成するときにDbContextを構成するにはどうすればよいですか?

.net-core c# dbcontext dependency-injection entity-framework-core

質問

Entity Frameworkの移行コマンドを使用するときに依存性注入を設定/ブートストラップする方法はありますか?

Entity Framework Coreは、 DbContextサブクラスの依存関係注入をサポートしています。このメカニズムには、 DbContext外のデータアクセスのコンフィグレーションが含まれます。

たとえば、次の例では、 config.jsonから取得した接続文字列を使用してSQLサーバーに永続化するようにEFを設定します

ServiceCollection services = ...

var configuration = new Configuration().AddJsonFile( "config.json" );
services.AddEntityFramework( configuration )
    .AddSqlServer()
    .AddDbContext<BillingDbContext>( config => config.UseSqlServer() );

ただし、migrationsコマンドはこのコードの実行を知らないため、プロバイダの不足または接続文字列の欠如のためにAdd-Migrationが失敗します。

移行は、上書きすることによって動作させることができるOnConfiguringDbContextプロバイダと設定文字列を指定するサブクラスが、異なる構成が他の場所で望まれるときには邪魔になります。最終的に私の移行コマンドと私のコードの両方を動作させることは、望ましくないほど複雑になります。

注:私のDbContextは、それを使用するエントリポイントとは異なるアセンブリに存在し、私のソリューションには複数のスタートアッププロジェクトがあります。

受け入れられた回答

@bricelamがコメントしたように、この機能はEntity Framework 7にはまだ存在しません。この欠落した機能は、GitHubの問題aspnet / EntityFramework#639によって追跡されます

その間、私が見つけた簡単な回避策は、サブクラス化を面倒ではなく、グローバルな状態を利用することでした。通常は私の最初のデザインの選択ではありませんが、今はうまくいきます。

MyDbContextで:

public static bool isMigration = true;

protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
    // TODO: This is messy, but needed for migrations.
    // See https://github.com/aspnet/EntityFramework/issues/639
    if ( isMigration )
    {
        optionsBuilder.UseSqlServer( "<Your Connection String Here>" );
    }
}

Startup.ConfigureServices()

public IServiceProvider ConfigureServices( IServiceCollection services )
{
    MyContext.isMigration = false;

    var configuration = new Configuration().AddJsonFile( "config.json" );
    services.AddEntityFramework( configuration )
        .AddSqlServer()
        .AddDbContext<MyDbContext>( config => config.UseSqlServer() );
    // ...
}

(私の場合、設定コードは実際にはAutofacモジュールの中にあります。)


人気のある回答

IDbContextFactory<TContext>使用

このインターフェイスを実装して、パブリックのデフォルトコンストラクタを持たないコンテキストタイプのデザインタイムサービスを有効にします。設計時サービスは、派生コンテキストと同じアセンブリ内にあるこのインタフェースの実装を自動的に検出します。

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
    public class BloggingContextFactory : IDbContextFactory<BloggingContext>
    {
        public BloggingContext Create()
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlServer("connection_string");

            return new BloggingContext(optionsBuilder.Options);
        }
    }
}

詳細情報: https : //docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

ハードコーディングされた接続文字列に満足できない場合は、 この記事をご覧ください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ