2017-09-01 143 views
1

我有一個簡單的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()?

回答

2

Startup.Configure()應該只包含配置請求管道的代碼。任何應用程序啓動/初始化代碼應該在Program.Main()

+0

好的,但我的問題是爲什麼當我運行添加遷移時它會被調用?當您調用add-migration命令時,Startup.Configure()中的所有代碼是否都會運行? –

+1

如果存在'Program.BuildWebHost()',EF核心工具將調用它來訪問應用程序服務提供者。是的,這(不幸的是)會調用'Startup.Configure()'作爲一個副作用。解決方法是刪除它並使用'IDesignTimeDbContextFactory'。 – bricelam