ASP.NETコアRC2シードデータベース

asp.net-core asp.net-core-1.0 c# entity-framework-core

質問

私の問題は、Entity Frameworkコアデータベースにデータをシードしようとしていることであり、私の心の中では以下のコードショーが動作します。私はこれがApplicationDbContextコンストラクタで呼び出されるべきではなく、 startup呼び出されるべきであるが、これを行う方法がわからないことに気づいた。

編集:Ketrexによって提供されるソリューションに基づいて、私の解決策は次のとおりです:

Startup.cs:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ... 

        app.ApplicationServices.GetRequiredService<ApplicationDbContext>().Seed();
    }

種子の伸長:

public static class DbContextExtensions
{
    public static void Seed(this ApplicationDbContext context)
    {
        // Perform database delete and create
        context.Database.EnsureDeleted();
        context.Database.EnsureCreated();

        // Perform seed operations
        AddCountries(context);
        AddAreas(context);
        AddGrades(context);
        AddCrags(context);
        AddClimbs(context);

        // Save changes and release resources
        context.SaveChanges();
        context.Dispose();
    }

    private static void AddCountries(ApplicationDbContext context)
    {
        context.AddRange(
            new Country { Name = "England", Code = "En" },
            new Country { Name = "France", Code = "Fr" }
            );
    }

    ...
}

私は、Entity Frameworkの優先順位リストでデータベースをシードすることはかなり高いと思っていますが、この些細な作業を達成する方法や少なくとも一時的な回避策を提供する方法についてのドキュメントがあれば素晴らしいでしょう。誰かがこれを行う方法に関するいくつかのガイダンスを提供することができれば、それは非常に高く評価されるだろう。私は私が解決策に近いと感じるが、ちょうど一緒にそれをまとめることはできません。

助けてくれてありがとう。

受け入れられた回答

組み込みのDIコンテナを使用していると仮定すると、これを実現する方法の1つがここにあります。

起動クラスのConfigureメソッドでシードメソッドを参照し、DbContextではなくIApplicationBuilderオブジェクトをDbContextの代わりにパラメータとして渡します。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //...
    // Put this at the end of your configure method
    DbContextSeedData.Seed(app);
}

次に、シードメソッドを変更してIApplicationBuilderインスタンスを受け入れます。次に、DbContextのインスタンスをスピンアップして、次のようにシード操作を実行することができます:

public static void Seed(IApplicationBuilder app)
{
    // Get an instance of the DbContext from the DI container
    using (var context = app.ApplicationServices.GetRequiredService<ApplicationDbContext>())
    {
        // perform database delete
        context.Database.EnsureDeleted;
        //... perform other seed operations
    }
}

人気のある回答

また、Startup.cs ConfigureServicesメソッドからApplicationDbContextを利用できるようにすることもできます(dbcontextをサービスとして登録する)。

public void ConfigureServices(IServiceCollection services)
{
   var connectionString = Startup.Configuration["connectionStrings:DBConnectionString"];//this line is not that relevant, the most important thing is registering the DbContext
            services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(connectionString));
}

シード拡張メソッドを呼び出すConfigureメソッドに依存としてApplicationDbContextを追加します。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ApplicationDbContext myApplicationDbContext)
{
    //...
    myApplicationDbContext.Seed();
}

最後に、シードメソッドは重要なテーブルを素早くチェックすることができます。データベースを再作成するのはおそらく重すぎます:

public void Seed()
{
 //....      
 if(context.Countries.Any())
   return;
 //...
}

少なくとも別のオプションとして、あなたや他の人を助けてくれることを願っています。



Related

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