2016-11-15 73 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