EF Core可以配置“真正的”一对一关系,其中两端都是必需的吗?

问题描述 投票:3回答:1

EF Core documentation about One-To-One relations说:“在配置与Fluent API的关系时,使用HasOneWithOne方法。”仔细观察表明,这将根据是否使用IsRequired来配置One-To-ZeroOrOne或ZeroOrOne-To-ZeroOrOne关系。例:

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.SaveChangescontext.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强制执行。)

entity-framework-core ef-fluent-api
1个回答
3
投票

有没有办法配置需要两端的“真正的”一对一关系?

在撰写本文时(EF Core 2.1.2),答案(不幸的是)是否定的。

文档的Required and Optional Relationships部分说:

您可以使用Fluent API来配置关系是必需的还是可选的。最终,它控制外键属性是必需的还是可选的。

还有一个封闭的问题EF Core 2: One to One Required Not Being Enforced (also Navigation no longer needed?) #9152提出同样的问题,部分答复是:

当关系成为“必需”时,这意味着没有关联的主体实体,依赖实体不能存在。这样做是因为我使FK不可为空 - 即。 FK值必须引用一些主要实体。

但是,它没有说明没有依赖的现有主体。这总是可行的,因为在处理部分加载的图形时,实际上没有任何方法可以限制它。 (这与旧堆栈相同,尽管在某些情况下,状态管理器几乎可以随意地阻止某些事情发生。)通过将更强的语义应用于限制部分图形加载的聚合,可以强制执行这样的操作。未来的限制,但尚未完成。

© www.soinside.com 2019 - 2024. All rights reserved.