2016-11-15 8 views
1

このようなデータが存在しない場合は常に、データを使用してDBを初期化します。この例では、テーブル「国」が空の場合はいつでも、データが挿入されます。以下は、「スタートアップ」クラスからのコードです: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(); 
    } 
} 

指定された行は、「このコールが待たれていないため、コールが完了する前に、現在のメソッドの実行が継続」コンパイル警告となります。 OK、それは同期メソッドで、私は非同期メソッドを呼び出しています。この問題を解決する最善の方法は何ですか(どちらのオプションも問題ありません。実行を継続している間に非同期処理を開始するか、完了を待ってから続行してください)。

また、記載されているDBの初期化にStartup.Configureの代わりにApplicationDbContext.OnModelCreatingを使用する方が良いのだろうかと思います。あなたが使用する必要がありますしかし

答えて

-1

あなたが結果を必要といけないなら、あなたは、単に代わりTask.Thatのvoidを返すことができますが、警告

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

これで警告が消去されます。私は、質問の第2部分(ApplicationDbContext.OnModelCreating対Startup.Configure)の質問を開いたままにしています。 – Marko

関連する問題