EF Fluent API - Shadow 属性、IsRequired(True) 和 DeleteBehavior.NoAction / Restrict 的组合

问题描述

我遇到了熟悉的多级联路径问题:

父配置:

builder.HasMany(p => p.Persons)
    .WithOne(p => p.Parent)
    .HasForeignKey("ParentId")
    .OnDelete(DeleteBehavior.Cascade);

builder.HasMany(p => p.Places)
    .WithOne(p => p.Parent)
    .HasForeignKey("ParentId")
    .OnDelete(DeleteBehavior.Cascade);

放置配置:

// nothing Special

人员配置:

builder.HasOne(p => p.Place)
    .WithMany()
    .HasForeignKey("PlaceId")
    .Isrequired(true)
    .OnDelete(DeleteBehavior.NoAction);
  • 如果我有一个人,那么它必须与一个地方相关。
  • 我知道我需要在 Person > Place 关系上使用 DeleteBehavior.NoAction 因为父级已经在处理 Place 和 Person 记录上的 DeleteBehavIoUr.Cascade,所以从 Place 到 Person 的另一个级联将导致多个级联路径.
  • 我需要添加 Isrequired(true) 因为“PlaceId”是 EF 添加的影子属性认情况下,影子属性可以为空),而不是 Person 类上的声明属性。 (我不希望域模型需要实体本身的 PlaceId)。

问题在于,尽管指定了 NoAction 删除行为,但看起来“Isrequired(true)”似乎覆盖了这一点并强制执行:

onDelete: referentialAction.Cascade

关于迁移。如果我使用限制,结果相同。

我知道,如果 Person 引用的 Place 被删除,使用 NoAction 可能会导致 FK 违规,但我可以在我的 EF Graph 中进行管理。我所希望的似乎是完全合理的。

我做错了吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)