何时在 EF 中使用 WillCascadeOnDelete(false)?

Posted

技术标签:

【中文标题】何时在 EF 中使用 WillCascadeOnDelete(false)?【英文标题】:When to use WillCascadeOnDelete(false) in EF? 【发布时间】:2020-01-06 05:20:32 【问题描述】:

我知道Cascade Delete in Entity Framework的用法和效果,我的项目中一般默认不使用。但是,我不确定在删除父记录后删除所有子记录是否是好的行为。删除父项后是否需要保留子记录。 WillCascadeOnDelete(false)是否只用于保护子记录被误删?还是有其他情况需要使用WillCascadeOnDelete(false)

【问题讨论】:

【参考方案1】:

答案是:“这取决于您的业务”

例如,您有两个表:Category 和 Product 具有一对多关系

如果您使用 WillCascadeOnDelete(true),则意味着您的产品没有类别就无法存在。

否则,说明您的产品不受类别影响。

有关更多详细信息,您可以尝试在此处https://***.com/a/31600062/7338888 阅读有关聚合、组合和关联之间区别的更多信息。 希望对您有所帮助。

【讨论】:

感谢您的回复。即使我不在 EF 中使用 WillCascadeOnDelete(false),我在尝试删除父记录时也会遇到“DELETE 语句与 REFERENCE 约束冲突 ...”错误。在查看 Context 类时,我意识到我使用了modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();。那么,是不是也阻止了所有的表记录被级联删除,导致上面的错误呢? 有什么帮助吗? 嗯,这不是EF抛出的错误,这是数据库下的错误抛出,你能分享你的db结构吗?

以上是关于何时在 EF 中使用 WillCascadeOnDelete(false)?的主要内容,如果未能解决你的问题,请参考以下文章

何时不使用实体框架

EF 代码优先数据库/表初始化 - 何时发生?

EF Code First Database Initializer和Migrations Confusion

何时在 DbContext 上执行查询

ADO.NET Entity Framework 和 NHibernate - 何时使用其中之一

如何在 EF Core 的 Hot Chocolate 中打开和关闭包含