2015-10-10 7 views
2

Для веб-сайта MVC5 я хочу использовать инициализатор базы данных Entity Framework, который создает и заносит базу данных с некоторыми начальными значениями. Рядом с этим я хочу сохранить список миграций, которые я хочу запускать контролируемым образом при создании исходной базы данных (с некоторыми начальными значениями). Но независимо от того, что я пытаюсь выполнить, миграции выполняются до того, как будет создана и засеяна начальная база данных. После того, как много попыток и читать на постах я прибыл на следующий код:Невозможно отключить миграцию после инициализации базы данных

В Global.asax.cs:

Database.SetInitializer(new App_Start.ProjectHoursDatabaseInitializer()); 

Initialize выглядит следующим образом:

public class ProjectHoursDatabaseInitializer : IDatabaseInitializer<ProjectHoursDbContext> 
{ 
    public void InitializeDatabase(ProjectHoursDbContext context) 
    { 
     if (context.Database.Exists()) 
     { 
      if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false)) 
      { 
       var migrator = new DbMigrator(new ProjectHours.Migrations.Configuration()); 
       migrator.Update(); 
      } 
     } 
     else 
     { 
      context.Database.Create(); 
      // The problem is that migrations are executed at this point 
      // The migrations must not run (cannot run), 
      // The only thing that must happen is creating tables 
      // and inserting some initial data. 

      SeedDatabase(context); 
      context.SaveChanges(); 
     } 
    } 
} 

конфигурации миграции выглядит следующим образом:

internal sealed class Configuration : DbMigrationsConfiguration<ProjectHours.ProjectHoursDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     ContextKey = "ProjectHours.ProjectHoursDbContext"; 
    } 

    protected override void Seed(ProjectHours.ProjectHoursDbContext context) 
    { 

    } 
} 

Проблема в том, что, что бы я ни пытался, миграции выполняются пока исходная база данных еще не создана. Я этого не понимаю. В конфигурации четко сказано, что автоматическая миграция должна быть отключена. Похоже, это не случай. Есть идеи?

+0

Database.Create() может вызвать проблемы - это короткое замыкание стратегии инициализации. http://stackoverflow.com/questions/15692584/ef-5-code-first-create-a-new-database-and-run-all-migrations-programatically и https://msdn.microsoft.com/en- us/library/system.data.entity.database (v = vs.113) .aspx –

+0

Спасибо, к сожалению, если я заменил Create() на CreateIfNotExists(), я получаю тот же результат, запуск начинается без инициализации базы данных. –

ответ

0

Вы пробовали: Database.SetInitializer<ProjectHoursDbContext>(new CreateDatabaseIfNotExists()); у вас Global.asax?

+0

Да, вот как я начал. Но я попробовал это снова, чтобы быть уверенным. Случается, что миграции выполняются, а исключения возникают из-за отсутствия данных. Я не понимаю, что просто выполняется строка 'Database.SetInitializer (новая CreateDatabaseIfNotExists());' заставляет миграции запускаться. :( –

0

В конце концов, я решил проблему, просто используя миграции, вместо того, чтобы пытаться комбинировать инициализатор и миграции. Я создал первоначальные миграции, которая создает базу данных из менеджера пакетов: Enable-Миграция надстройки миграции InitialCreate

С этого момента, я следовал инструкциям, приведенные в этой статье, чтобы получить рабочий раствор, который можно использовать, чтобы создать исходную базу данных или обновить существующую производственную базу данных: https://galleryserverpro.com/using-entity-framework-code-first-migrations-to-auto-create-and-auto-update-an-application/

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