#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 я хочу использовать, что должно помочь мне исправить миграцию.