【问题标题】:Can EF Core configure a "real" One-To-One relation where both ends are required?EF Core 可以配置需要两端的“真实”一对一关系吗?
【发布时间】:2018-09-04 14:54:11
【问题描述】:

EF Core documentation about One-To-One relations 说:“在配置与 Fluent API 的关系时,您使用 HasOneWithOne 方法。” 仔细观察表明这配置了 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.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 关系是一对一的-零或一。换句话说:孩子的父母是必需的,父母的孩子是可选的。

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

也许这不能在数据库中强制执行。但它可以由 EF Core 强制执行吗? (顺便说一句:它可以由 EF6 强制执行。)

【问题讨论】:

    标签: entity-framework-core ef-fluent-api


    【解决方案1】:

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

    在撰写本文时(EF Core 2.1.2),答案(很遗憾)是否定的。

    文档的Required and Optional Relationships 部分说:

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

    还有一个已关闭的issueEF Core 2: One to One Required Not Being Enforced (also Navigation no longer needed?) #9152问同样的问题,部分回复是:

    当关系被设为“必需”时,这意味着如果没有关联的主体实体,依赖实体就不能存在。这是我使 FK 不可为空的——即FK 值必须引用某个主体实体。

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

    【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2021-12-29
    • 2023-02-10
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-07-21
    相关资源
    最近更新 更多