ASP.NET Core RC2種子數據庫

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

我的問題是我試圖用數據種子實體框架核心數據庫,在我看來下面的代碼顯示工作。我已經意識到這不應該在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" }
            );
    }

    ...
}

我知道在實體框架的優先級列表中播種數據庫是相當高的,但如果有一些關於如何實現這個微不足道的任務或者至少提供臨時工作的文檔會很好。如果有人可以就如何做到這一點提供一些指導,我們將不勝感激。我覺得我接近一個解決方案,但只是不能把它拼湊在一起。

謝謝你的幫助。

一般承認的答案

假設您使用的是內置DI容器,這是一種可以實現此目的的方法。

在啟動類的Configure方法中引用種子方法,並將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();
}

最後種子方法可以快速檢查一個重要的表,因為重建db可能太重了:

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合法嗎? 是的,了解原因