【发布时间】:2018-09-04 14:54:11
【问题描述】:
EF Core documentation about One-To-One relations 说:“在配置与 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 关系是一对一的-零或一。换句话说:孩子的父母是必需的,父母的孩子是可选的。
有没有办法配置一个需要两端的“真正的”一对一关系?
也许这不能在数据库中强制执行。但它可以由 EF Core 强制执行吗? (顺便说一句:它可以由 EF6 强制执行。)
【问题讨论】:
标签: entity-framework-core ef-fluent-api