Документация 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.)