EF Core - 为什么对于可选关系,ClientSetNull是默认的OnDelete行为(而不是SetNull)?

20
针对可选关系(即外键可以接受 Null )的情况,自EF Core 2.0以来引入了一个新的 ClientSetNull 行为作为默认的删除行为选项 DeleteBehavior.ClientSetNull 。 这对于已跟踪的实体具有 SetNull 语义,并且对于未加载到内存中的数据库记录具有 Restrict (无操作)行为。

级联删除行为

Microsoft文档表示:

如果您希望数据库尝试将空值传播到子外键,即使子实体未加载,则使用 SetNull 。但是,请注意,数据库必须支持此操作,并且配置数据库可能会导致其他限制,这在实践中通常使此选项不可行。这就是为什么SetNull不是默认值的原因。

但我认为通常在数据库中关联的父实体被删除时设置依赖实体的FK为Null是很正常的。此外,“其他限制,这在实践中通常使此选项不可行的限制是什么?”如上所述?

1个回答

12

据我所知,文档提到的那些限制,可能是指循环或多重级联。

例如,MS Sql Server不允许进行级联删除和级联设置为空(set null),如果:

  • 更改会级联到与其来源相同的表
  • 有多个级联路径通向同一张表。比如,表‘A’影响表‘B’和‘C’,而‘B’和‘C’都影响‘D’。

甚至无法创建此约束。

EF Core可以通过ClientSetNull绕过此限制。EF处理设置为空操作,但只有在所有受影响的实体都加载到内存中时,才能这样做。


谢谢您的回答,虽然我已经点赞了,但我认为您在这里指定的是一些罕见的情况,不足以使其成为默认选项! - S.Serpooshan
1
很奇怪SQL Server不支持这个,但我很高兴学会了解决这个问题的方法。只要确保它们被正确跟踪即可。感谢您提供的清晰解释。 - M. Azyoksul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接