.net-core - EFCore OnDelete 级联多对一
问题描述
我有一个数据模型,大致如下:
public class Entity1
{
public Guid Id { get; set; }
}
public class Entity2
{
public Guid Id { get; set; }
public Entity1 RelatedEntity { get; set; }
}
Entity2s
在我的情况下,每个都可以有很多,但据我所知,在我的数据模式中跟踪所有使用它的Entity1
人并没有任何意义。也许我误解了应该如何构建数据模型。Entity1
Entity2s
似乎(来自 Microsoft 教程)为了进行设置,.OnDelete(DeleteBehavior.Cascade);
您需要在实体之间建立双向链接。有谁知道是否有可能做到这一点,如果Entity1
被删除,它也会包含所有Entity2
实例?我是否必须更改我的数据模型以Entity1
存储列表Entity2's
?
谢谢!
解决方案
不需要任何导航属性。
配置关系所需的只是一对正确的Has{One|Many}
+ With{One|Many}
。正确我的意思是以下 - 如果对应关系端有导航,它必须作为参数传递,否则不应传递 lambda 表达式/属性名称)。
即在你的情况下,你可以使用
modelBuilder.Entity<Entity2>()
.HasOne(e2 => e2.RelatedEntity)
.WithMany() // no navigation property
或者
modelBuilder.Entity<Entity1>()
.WithMany<Entity2>() // no navigation property
.HasOne(e2 => e2.RelatedEntity)
这些是等效的,使用一个或另一个,两者都不使用(以避免冲突的配置/差异 - 毕竟,关系只是一个,即使有两端)。
一旦你这样做了,你就可以访问关系 API 来配置 FK、级联删除等,例如
.OnDelete(DeleteBehavior.Cascade)
您还可以使 FK 成为必需(默认情况下将打开级联删除):
.IsRequired()
有关详细信息,请参阅 EF Core 文档的“关系”部分,尤其是Manual configuration 和Single navigation property。
推荐阅读
- javascript - 我需要帮助来合并对象数组中的值 - Javascript
- rust - 有没有办法从 HashSet 中获取对象
> 使用自定义借用实现而不是创建新类型? - python - Python线程不听标志
- powershell - 如何使用 powershell 将 Powercfg /availablesleepstates 输出到对象中
- firebase - 是否可以在 Firebase 控制台中获取哪个用户触发了事件?
- node.js - 如何在 Sequelize 的用户模型中设置自动密码哈希?
- java - 登录后用户变为匿名
- python - 如何使用 rv_continuous 从高斯 kde 生成随机样本?
- sbt - 是否可以在 sbt IO.copy 命令中使用通配符
- azure - Azure Functions v3 中的 FromQuery 支持