2016-11-20 3 views
4

Я просто следую первому подходу к корневому интерфейсу сущности в моем проекте, и у меня возникли некоторые проблемы. Всегда я вынужден восстановить db с помощью команд. однако теперь мне удается получить эту стабильную. У меня сценарий, и в этом, структура создает сценарий миграции, не является логичным, может быть, я что-то упускаю и нуждаюсь в вашей помощи в этомEntity Framework - Code First Approach

Сценарий - я включил миграцию и создал начальную настройку класс со всей моей настройкой таблицы, я очень впечатлен этим. но когда я внести изменения в сущности, для, например, у меня есть Deal класса

Я добавил новое свойство LenderName, BorrowerName и запустить дэ надстройку миграции сценарий, он создал миграционную сценарий для меня,

public partial class LenderBorrowerName : DbMigration 
    { 
     public override void Up() 
     { 
      DropColumn("dbo.Deals", "LenderName"); 
      DropColumn("dbo.Deals", "BorrowerName"); 
      DropColumn("dbo.Deals", "Discriminator"); 
     } 

     public override void Down() 
     { 
      AddColumn("dbo.Deals", "Discriminator", c => c.String(nullable: false, maxLength: 128)); 
      AddColumn("dbo.Deals", "BorrowerName", c => c.String()); 
      AddColumn("dbo.Deals", "LenderName", c => c.String()); 
     } 
    } 

Проблема заключается в том, что исходная база данных не имеет этого поля и через этот сценарий миграции предполагается добавить в базу данных. Чтобы обновить эти поля, если я запустил команду update-migration -force, она завершилась неудачно из-за функции up() выше, поскольку она пытается удалить столбец из таблицы. Почему Microsoft добавляет этот сценарий удаления, заключается в том, что разработчику необходимо удалить вручную? пожалуйста, помогите

ответ

0

Подсказка: Discriminator column. EF применяет стратегию по умолчанию для реализации наследования, которая называется TPH, Table-Per-Hierarchy. Поле Discriminator автоматически генерируется EF, когда у вас есть наследование между вашими сущностями.

Похоже, вы сделали больше изменений в своей модели, чем добавили эти два свойства к существующей сущности: вы, вероятно, перенесли их из производного класса в базовый класс или наоборот. Также кажется, что ваш DbContext включает только DbSet для базового объекта или производного объекта, но не для обоих. Имейте в виду, что миграция по умолчанию включает только объекты, которые включены в ваш DbContext, как DbSets (вы также можете включать или исключать их явно в ваших сопоставлениях). Таким образом, ваша миграция генерирует только поля для объекта в вашем DbContext, а не для другого, и EF интерпретирует, что вы удалили эти свойства, поэтому вы получаете DropColumn предложений.

Таким образом, решение здесь заключается в том, чтобы добавить отсутствующий DbSet в DbContext и сгенерировать миграцию снова.

Here У вас может быть больше информации о TPH.

Другое объяснение может быть, что после запуска Update-Database и Add-Migration несколько раз и с помощью параметра -force ваша база данных остается в состоянии, которое не согласуется с содержимым вашего __MigrationHistory таблицы. Моим советом было бы вручную удалить базу данных, если возможно, произвести чистую миграцию Initial и запустить ее.

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