2016-11-15 101 views
1

我想用數據初始化數據庫,只要這些數據不存在。在這個例子中,無論何時表「國家」爲空,都會插入數據。以下是從「啓動」類的代碼:asp net核心數據庫初始化(播種數據)

public class Startup 
{ 
    // lines of code... 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     // lines of code... 

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

public static class DbContextExtensions 
{ 
    public static void Seed(this ApplicationDbContext db) 
    { 
     AddCountries(db); // <= WARNING HERE 
    } 

    private static async Task AddCountries(ApplicationDbContext db) 
    { 
     if (await db.Country.CountAsync() == 0) 
     { 
      db.AddRange(
       new Country { Name = "England", Code = "En" }, 
       new Country { Name = "France", Code = "Fr" } 
       ); 
     } 
     db.SaveChanges(); 
    } 
} 

指定行結果用匯編警告「因爲這個呼叫沒有等待,目前的方法的執行繼續完成通話之前」。好吧,這是一個同步方法,我打電話給一個異步方法。解決這個問題的最好方法是什麼(這兩個選項都很好:在繼續執行的同時啓動異步處理od數據插入,或者等待其完成並繼續)。

此外,我想知道是否最好使用ApplicationDbContext.OnModelCreating而不是Startup.Configure來描述數據庫初始化。

回答

-1

如果你不需要的結果,那麼你可以簡單地返回,而不是Task.That空隙可爲您節省警告

private static async void AddCountries(ApplicationDbContext db) 
    { 
     if (db.Country.Any()) 
     { 
      return; // DB has been seeded 
     } 

     db.AddRange(
      new Country { Name = "England", Code = "En" }, 
      new Country { Name = "France", Code = "Fr" } 
      ); 

     db.SaveChanges(); 
    } 

但是你應該使用伺機進行實際操作(任務),不計較行。

+0

好的,這消除了警告。我將問題的第二部分留給問題(ApplicationDbContext.OnModelCreating與Startup.Configure)。 – Marko