Может ли EF Core настроить «реальное» отношение «один к одному», где требуются оба конца? - PullRequest
0 голосов
/ 04 сентября 2018

Документация EF Core об отношениях «один к одному» гласит: «При настройке отношений с помощью Fluent API вы используете методы HasOne и WithOne». При более внимательном рассмотрении показано, что это настраивает отношения One-To-ZeroOrOne или ZeroOrOne-To-ZeroOrOne в зависимости от того, используется IsRequired или нет. Пример:

public class ParentEntity
{
  public Int64 Id { get; set; }
  public ChildEntity Child { get; set; }
}

public class ChildEntity
{
  public Int64 Id { get; set; }
  public ParentEntity Parent { get; set; }
}

Производный контекстный класс содержит:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<ParentEntity>().HasOne(p => p.Child).WithOne(d => d.Parent)
                                     .HasForeignKey<ChildEntity>("ParentFk").IsRequired();
}

В этой конфигурации context.SaveChanges завершается с ошибкой после context.Add(new ChildEntity()), как и ожидалось (с SqlException: Cannot insert the value NULL into column 'ParentFk' ... из-за IsRequired), но успешно после context.Add(new ParentEntity()) и context.Add(new ChildEntity() { Parent = new ParentEntity() }), т. Е. Отношение ParentEntity-ChildEntity является One-To -ZeroOrOne. Другими словами: родитель ребенка обязателен, потомок родителя необязателен.

Есть ли способ настроить «реальное» отношение «один к одному», где требуются оба конца?

Возможно, это не может быть применено в базе данных. Но может ли это быть обеспечено EF Core? (Кстати: это может быть обеспечено EF6.)

1 Ответ

0 голосов
/ 04 сентября 2018

Есть ли способ настроить «реальное» отношение «один к одному», когда требуются оба конца?

На момент написания (EF Core 2.1.2) ответ (к сожалению) отрицательный.

В разделе Обязательные и необязательные отношения в документации написано:

Вы можете использовать Fluent API для настройки того, является ли связь обязательной или необязательной. В конечном итоге это определяет, является ли свойство внешнего ключа обязательным или необязательным.

Существует также закрытая проблема EF Core 2: требуется одно к одному, не применяется (также не требуется навигация?) # 9152 задает тот же вопрос, и часть ответа:

когда отношение установлено как «Обязательное», это означает, что зависимый объект не может существовать без ассоциированного основного объекта. Это сделано для того, чтобы сделать ФК ненулевым - то есть. значение FK должно ссылаться на некоторый основной объект.

Однако это ничего не говорит о главном существе, существующем без зависимого. Это всегда возможно, потому что на самом деле нет никакого способа ограничить его при работе с частично загруженными графиками. (Это было то же самое со старым стеком, хотя были некоторые ситуации, когда менеджер состояний почти произвольно останавливал бы определенные вещи.) С более сильной семантикой, примененной к агрегатам, которые ограничивают частичную загрузку графов, может быть возможно реализовать такой ограничение в будущем, но это еще не сделано.

...