2016-11-15 4 views
1

Я хочу инициализировать БД данными, когда такие данные еще не существуют. В этом примере, когда таблица «Страна» пуста, данные будут вставлены. Ниже приведен код из класса «Автозагрузка»:asp net core database initialization (seeding the data)

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(); 
    } 
} 

Назначенные результаты линии с предупреждением компиляции «Поскольку этот вызов не ожидал, выполнение текущего метода продолжается до завершения звонка». Хорошо, это синхронный метод, и я вызываю метод async. Каков наилучший способ решения этой проблемы (оба варианта в порядке: запуск асинхронной обработки вставки данных при продолжении выполнения или ожидание его завершения, а затем продолжение).

Кроме того, интересно, лучше ли использовать ApplicationDbContext.OnModelCreating вместо Startup.Configure для описанной инициализации DB.

ответ

-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(); 
    } 

Однако вы должны использовать AWAIT для выполнения фактической работы (задачи) не подсчитать строк.

+0

ОК, это устраняет предупреждение. Я оставляю вопрос открытым для второй части вопроса (ApplicationDbContext.OnModelCreating vs Startup.Configure). – Marko

Смежные вопросы