Entity Framework 6 Code ContextKey для первой миграции

entity-framework entity-framework-6

Вопрос

Теперь я использую EF6 Alpha, и при использовании миграции он добавит новый журнал миграции в таблицу __MigrationHistory.

В EF6 таблица __MigrationHistory имеет новый столбец под названием «ContextKey». После тестирования я обнаружил, что есть два значения по умолчанию «ContextKey»:

  1. Полное имя производного класса DbContext. Это происходит, когда я запускаю код:

    Database.CreateIfNotExists();
    
  2. Полное имя производного класса DbMigrationsConfiguration. Это происходит, когда я запускаю код:

    public ArticleDbContext()
    {   
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ArticleDbContext, ArticleConfiguration>());
    }
    

При первом запуске приложения «Database.CreateIfNotExists ();» создайте для меня новую базу данных, а также все таблицы, которые сопоставляются с моделями, определенными в ArticleDbContext, а затем добавьте строку __MigrationHistory, значение ContextKey которой является «Module.Article.Model.ArticleDbContext».

И затем «Database.SetInitializer (новый MigrateDatabaseToLatestVersion ()); будет запущен, этот код будет генерировать новый ContextKey «PowerEasy.Module.Article.Migrations.ArticleConfiguration». Миграция запрашивает таблицу __MigrationHistory с этим ContextKey и выясняет, что данных нет. Таким образом, он будет создавать все таблицы, которые сопоставляются с моделями, определенными в ArticleDbContext, но таблицы уже существуют в базе данных, поэтому будет выбрано исключение и скажите, что «таблица XXX уже существует».

Как я могу это решить?

Принятый ответ

Не следует смешивать Migrations и метод Database.CreateIfNotExists (или любой из инициализаторов, построенных поверх него). Миграции позаботятся о создании базы данных, если она еще не существует.

В качестве альтернативы инициализатору Migrations вы также можете применять миграции с использованием метода DbMigrator.Update . Это полезно, если вы хотите создать / обновить базу данных, прежде чем она будет инициирована инициализатором.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему