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

时间:2019-01-23 11:25:28

标签: entity-framework-core cascade ef-core-2.0

对于可选关系(当外键可以接受Null时),自EF Core 2.0起引入了新的ClientSetNull行为,作为删除行为{{ 1}}。 对于被跟踪实体,它具有DeleteBehavior.ClientSetNull语义,对于未加载到内存中的数据库记录,它具有SetNull(无动作)行为。

Cascade Delete behaviors

Microsoft docs说:

  

如果您希望数据库也尝试将空值传播给子级   即使未加载子实体,也可以使用外键   Restrict。但是,请注意,数据库必须支持此功能,并且   像这样配置数据库可能会导致其他限制,   实际上,这通常使该选项不切实际。这就是为什么   SetNull不是默认值。

但是我认为删除关联的父对象时(在db中的每个位置)将依赖实体的FK设置为​​Null通常是正常的。还有,如上所述的那些“其他限制,在实践中通常会使该选择不切实际..”?

1 个答案:

答案 0 :(得分:1)

据我所知,文档所指的其他限制是循环或多路径级联。

例如,如果

MS Sql Server不允许进行级联(删除并设置为null)

  • 更改将级联到它源自的同一张表
  • 同一张表有多个级联路径。就像表“ A”会影响表“ B”和“ C”一样,“ B”和“ C”都会影响“ D”。

您甚至无法创建约束。

EF内核可以使用ClientSetNull来规避此限制。 EF处理设置为null的操作,但只有在所有受影响的实体都已加载到内存中时,它才能这样做。