#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. Да, именно так.