我有一個簡單的DbContext,MyDbContext,與2個DbSets:不EF核心遷移調用Startup.Configure()上附加遷移
public DbSet<User> Users { get; set; }
public DbSet<Privilege> Privileges { get; set; }
當我跑PM控制檯添加遷移,已成功生成遷移。然後我添加了代碼來爲Privileges表種子。我添加的代碼是在Startup.Configure():
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<OneSourceDbContext>().Database.Migrate();
serviceScope.ServiceProvider.GetService<OneSourceDbContext>().EnsureSeedData();
}
EnsureSeedData是一個擴展方法,看起來像這樣:
public static void EnsureSeedData(this OneSourceDbContext context)
{
if (!context.Database.GetPendingMigrations().Any())
{
if (!context.Privileges.Any())
{
context.Privileges.Add(new Models.Privilege { Name = "Add/Edit" });
context.SaveChanges();
}
}
}
添加該代碼後,我刪除所有遷移,並試圖再次產生,但這次它說特權是無效的對象。此外,即使我尚未運行該項目並且尚未調用update-database,也會生成一個空的數據庫。如果我在Configure()方法中註釋EnsureSeedData,則會生成遷移。
我認爲2線Database.Migrate()和EnsureSeedData()當我運行該項目將只被調用,但似乎這裏面檢查EnsureSeedData()
!context.Privileges.Any()
導致遷移失敗。啓動時添加遷移是否確實調用了Configure()?它令人困惑,因爲我只想創建遷移文件,爲什麼它運行(或似乎運行)EnsureSeedData()?
好的,但我的問題是爲什麼當我運行添加遷移時它會被調用?當您調用add-migration命令時,Startup.Configure()中的所有代碼是否都會運行? –
如果存在'Program.BuildWebHost()',EF核心工具將調用它來訪問應用程序服務提供者。是的,這(不幸的是)會調用'Startup.Configure()'作爲一個副作用。解決方法是刪除它並使用'IDesignTimeDbContextFactory'。 – bricelam