1

Это приложение ASP.NET MVC с платформой Entity Framework 6.1 Code First.ASP.NET Entity Framework Code First Migrarion

Мне нужно мое приложение для СОЗДАНИЯ базы данных, если оно не существует и заселяет таблицы некоторыми данными. Также мне нужно перенести базу данных при запуске приложения, если модель изменилась с помощью MigrateDatabaseToLatestVersion.

На Application_Start я есть:

protected void Application_Start() 
{ 
    Database.SetInitializer(new MyAppDataInitializer()); 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyAppDataContext, MyApp.Model.Migrations.Configuration>()); 
} 

Инициализатором:

public class MyAppDataInitializer: CreateDatabaseIfNotExists<MyAppDataContext> 
{ 
    protected override void Seed(MyAppDataContext context) 
    { 
     Code to add some "CREATION DATA" 
    } 
} 

Вот класс конфигурации миграции:

public class Configuration : DbMigrationsConfiguration<MyApp.Model.DataContext.MyAppDataContext> 
    { 
     public Configuration() 
     { 
      AutomaticMigrationsEnabled = true; 
      AutomaticMigrationDataLossAllowed = true; 
      ContextKey = "MyApp.Model.DataContext.MyAppDataContext"; 
     } 

     protected override void Seed(MyApp.Model.DataContext.MyAppDataContext context) 
     { 
      Code to add some "MIGRATION DATA" 
     } 
    } 

Когда мое приложение запускается он работает, как ожидалось, за исключением во-первых:

  • Если база данных существует, она отлично работает, она изменяет базу данных в соответствии с новой моделью и заселяет базу данных с помощью «ДАННЫХ МИГРАЦИИ».

  • Если база данных не существует, она создает базу данных, но она только заселяет базу данных с помощью «ДАННЫХ МИГРАЦИИ», но не с «ДАННЫМИ СОЗДАНИЯ». Метод SEED на inicializer не вызывается.

Я уверен, что есть что-то я делаю неправильно, но я не могу понять, как я могу создать базу данных, если она не существует и семян некоторых «INIT» данные, которые только вставить в первый раз.

Затем при изменении модели он только изменяет базу данных и добавляет данные, которые я настраиваю в методе семян миграции, в случае необходимости.

Не могли бы вы мне помочь?

Заранее спасибо.

ответ

1

Вы перезаписываете инициализатор. Это «набор» не «добавить» инициализатор и может быть только один ..

protected void Application_Start() 
{ 
    Database.SetInitializer(new MyAppDataInitializer()); 
    // Now the initializer gets "re-set" again and MyAppDataInitializer is not used at all 
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyAppDataContext, MyApp.Model.Migrations.Configuration>()); 
} 
+0

Вижу, спасибо. Так как я могу делать то, что хочу? Могу ли я спросить, существует ли база данных где-то, а если нет, то после ее создания вставьте данные о создании? Или есть событие, подобное созданию базы данных? –

0

Вы можете проверить, если база данных существует или нет внутри MyApp.Model.Migrations.Configuration класса. В Seed метод проверки первой базы данных существует, если не создавать базу данных, а затем данные семени.

+0

Когда я проверяю это событие (Seed), оно ВСЕГДА существует. Даже если в это время база данных не была создана ... –

+0

Опубликовать код для создания данных и данных миграции –

+0

Мой код находится в первом посте. Теперь я удалил код создания, потому что может быть только одним ... но если я проверю, существует ли база данных внутри метода Seed, она всегда существует. –