Зависимое свойство в ReferentialConstraint сопоставляется столбцу, сгенерированному хранилищем. Идентификатор столбца в наследовании TPT

#c# #entity-framework #inheritance #table-per-type

#c# #entity-framework #наследование #таблица для каждого типа

Вопрос:

Сначала я использую код EF, у меня есть следующие объекты:

введите описание изображения здесь

Я использую TPT метод наследования, чтобы создать однозначное или нулевое отношение, написал следующий код:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
                .HasOptional(x => x.ProductionInstruction)
                .WithRequired(x => x.Order);
}
  

Я пишу следующий код, чтобы сохранить ProductionInstruction :

 var pi = new ProductionInstruction();
/* set pi properties */
ctx.ProductionInstructions.Add(pi);
ctx.SaveChanges();
  

При запуске я получаю следующую ошибку ctx.SaveChanges() :

Зависимое свойство в ReferentialConstraint сопоставляется столбцу, сгенерированному хранилищем. Столбец: ‘Id’.

Есть ли какой-либо способ реализовать 1 ..0-1 между моими двумя объектами без вышеуказанной ошибки?

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

1. И есть ли ссылка на заказ в /* set pi properties */ ? Должно быть.

Ответ №1:

В Entity Framework взаимно однозначное сопоставление с требуемым участником реализуется путем предоставления зависимому первичному ключу, который также является внешним ключом для участника. Зависимый копирует свой первичный ключ из основного.

В вашем случае EF хочет ProductionInstruction.Id быть внешним ключом Order.Id , и его значение должно быть скопировано из Order того, к которому оно принадлежит. Однако из-за наследования ProductionInstruction.Id является столбцом идентификатора (сгенерированным хранилищем), поэтому его нельзя установить в коде.

Вам либо нужно удалить наследование, так ProductionInstruction.Id что оно может быть сопоставлено как не созданное хранилищем, либо изменить сопоставление на необязательное с обеих сторон. Последний предоставит ProductionInstruction отдельный внешний ключ для Order .

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

1. В вашем 2-м решении вы имеете в виду, что я использую modelBuilder.Entity<Order>() .HasOptional(x => x.ProductionInstruction) .WithOptionalPrincipal(x => x.Order) ?

2. Да, именно так.