Ключ миграции Entity Framework(x => x.Id) не генерирует столбец идентификаторов

#c# #entity-framework

Вопрос:

Я использую это решение C# в течение многих лет, создавая миграции, но я никогда не видел, чтобы это происходило раньше. Для всех моих других типов сущностей это работает нормально. Это entity framework 6.4.

Пример рабочего сопоставления:

   public sealed class PresentationMapping : EntityTypeConfigurationlt;Presentationgt;  {  public PresentationMapping()  {  HasKey(x =gt; x.Id);   

Генерирует эту миграцию:

   CreateTable(  "dbo.Presentation",  c =gt; new  {  Id = c.Long(nullable: false, identity: true),  

Однако для этой таблицы он не установлен identity: true .

 public sealed class ProductDetailSnapshotMapping : EntityTypeConfigurationlt;ProductDetailSnapshotgt;  {  public ProductDetailSnapshotMapping()  {  HasKey(t =gt; t.Id);  

Генерирует эту миграцию:

 CreateTable(  "dbo.ProductDetailSnapshot",  c =gt; new  {  Id = c.Long(nullable: false),  

Без identity:true набора. Я перепробовал все способы удаления и повторного добавления миграции, и эта таблица отказывается устанавливаться identity:true .

Вот мое определение класса. Каждая другая сущность, которую я использую, также наследуется от этого Entity класса, чтобы определить Id точно так же.

 public class ProductDetailSnapshot : ProductEntity  {  public long ExternalSupplierId { get; set; }  public long ProductId { get; set; }  public string ProductDetailJson { get; set; }  }  public abstract class ProductEntity : Entity  {  public long PresentationProductId { get; set; }  public PresentationProduct PresentationProduct { get; set; }  }  public abstract class Entity : IEntity  {  public long Id { get; set; }  }  

Я знаю, что мог бы заставить это вручную изменить миграцию, но я хочу, чтобы отображение правильно отображало это, и на самом деле мне действительно нужно создать новую миграцию, чтобы исправить это в другой среде, поэтому я хотел бы, чтобы EF сгенерировал сценарий, чтобы сделать это за меня.

Почему моя таблица отказывается установить этот столбец идентификатора в качестве идентификатора? Как я могу заставить сопоставление принудительно указывать столбец идентификаторов в идентификаторе?

Комментарии:

1. Вы пробовали .Property(t=gt;t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

2. Да, спасибо, я собираюсь опубликовать ответ, который я нашел по этому поводу

Ответ №1:

Я обнаружил, что могу конкретно указать идентификатор как идентификатор, созданный в базе данных, что решило проблему.

В базе классов сопоставления, которые мы используем (для краткости удалены из вопроса), явно не указано, что идентификатор следует использовать в качестве столбца идентификаторов. Где-то ЭФ делал такой вывод, и по какой-то странной причине он просто не стрелял по этому столу. Добавление этой строки в мой базовый EntityMap конструктор исправило это.

 HasKey(t =gt; t.Id); Property(t =gt; t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);  

Мое единственное предположение о том, почему это происходит, заключается в том, что слово «Снимок» имеет какое-то специальное кодирование в Entity Framework, и оно игнорирует какое-то соглашение из-за этого имени. Я думаю, что есть какой-то особый класс, такой как «DatabaseSnapshot», который потенциально может быть причиной, но это чистое предположение.

Я попытался изменить его ProductDetailSnapshotasdf , чтобы проверить эту теорию, но проблема не исчезла. Я не пытался Snapshot полностью удалить название, так как к этому времени нашел решение выше, но мне было бы очень любопытно узнать настоящую причину здесь.

ОБНОВЛЕНИЕ: Я нашел истинную причину. Я настроил эту Snapshot таблицу как один к одному PresentationProduct . Я пытался настроить это с помощью выделенного столбца FK Snapshot.PresentationProductId , но способ, которым я его сопоставил, заключался в том, что EF думал, что Snapshot.Id это будет указывать на PK/FK PresentationProduct.Id . Таким образом, поскольку это был PK/FK, EF не присваивал ему столбец идентификаторов.

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