IsRequired()
和OnDelete()
相互影响,但不是严格意义上的interchangable.有7个不同的DeleteBehaviour
值,而IsRequired
只有2个状态,因此根据传递到IsRequired(bool)
的值,默认约定只配置了2个状态.
- 使用
IsRequired()
根本不是强制性的,如果省略,则由关联属性的类型的nullability推断.如果属性是nullable,则隐含IsRequired(false)
,否则隐含IsRequired(true)
.
如果您的用例与默认约定匹配,那么您根本不需要同时指定IsRequired()
和OnDelete()
.您仍然可以 Select 这样做,以明确您的意图,但是添加了约定的概念,这样您就可以在一个地方做出全局决策,并减少代码中对规则的引用,这些规则变得更加难以维护.
那么,这对OnDelete()
有什么影响呢?
See DeleteBehaviour
Cascade
Automatically deletes dependent entities when the principal is deleted or the relationship to the principal is severed, and creates creates a foreign key constraint in the database with cascading deletes enabled. This is the default for required relationships.
ClientSetNull
个
当对跟踪的实体进行更改时,根据需要将外键值设置为NULL,并在数据库中创建非级联外键约束.这是可选关系的默认设置.
根据EF中的默认约定(您可以覆盖),当FK标记为required到IsRequired(true)
时,级联删除将是删除相关主体记录的默认行为.
- 不能使用
IsRequired(true)
和DeleteBehaviour.SetNull
,因为这没有意义,第一条语句说null
是不允许的,第二条语句试图强制赋值null
.
如果 Select 通过IsRequired(false)
将FK设置为可选,则默认为OnDelete()
为DeleteBehaviour.ClientSetNull
.这意味着删除主体实体时,只有在删除之前的上下文中加载的实体的FK才会设置为NULL.如果数据库中有其他记录引用了相同的FK值,则当您try 保存更改时,会由于违反数据库引用约束而失败.
如果希望数据库主动为引用相同FK值的数据库中的所有其他记录设置FK,则MUST指定OnDelete(DeleteBehavior.SetNull)
以向将执行此清理逻辑的数据库添加约束.
IsRequired(bool)
通常不需要与OnDelete()
一起使用,但这只是因为您在FK特性上智能设置了可为空性.如果对FK使用阴影特性,则IsRequired()
实际上是required,否则标准约定是使用FK的可为空性.