我应该编写删除操作处理还是让级联完成这项工作?

本文关键字:级联 工作 删除 操作 处理 我应该 | 更新日期: 2023-09-27 18:07:20

我正在使用Entity Framework 6.0.1 Code-First方法,我正在从数据库中删除我的对象。

对于0..1-N关系,我将Delete on Cascade规则设置为true:

HasRequired(i => i.OneEntity).WithMany(v => v.ManyEntities).
    WillCascadeOnDelete(true);

现在,在我的移除方法中,我做了以下操作:

对于1-N关系,我从上下文中删除相对对象:

//OneEntity is an entity that contains a list of referenced entities
//of another type.
RootEntity.OneEntity.ManyEntities.ForEach(be  => ctx.OtherElements.Remove(be));

对于0..1-1关系,我从对象列表中删除元素,如果是可选的(如果是必需的,EF约定指定自动应用级联(旧问题)):

//One entity is a reference to another entity of another type of  
//RootEntity.
ctx.OneEntities.Remove(RootEntity.OneEntity);

对于N-N关系,我清除对象列表:

//No context removal operation here.
RootEntity.ManyToManyEntities.Clear();

现在,当它工作时,我感觉我做错了事情,或者在最佳处理方面应用了不必要的操作。

我对重构的第一个想法是:

1)从1- n关系中删除任何上下文删除代码,因为级联可能会完成这项工作。

2)对可选的1-1关系应用级联。

3)删除N-N关系的所有列表清除,因为这应该自动完成。

我应该继续这些想法,还是整个代码都可以进行这种处理?是否有更好的替代策略来删除对象?我的缺点是级联可能会导致不必要的副作用,这取决于所使用的数据库支持什么。

我应该编写删除操作处理还是让级联完成这项工作?

如果您在数据库中配置了适当的关系,则级联删除将自动发生- sql将自行执行。因此,在那一刻之后,子实体将不存在,如果您用另一个请求尝试它,您将没有什么可删除的。

我使用EF 6"代码优先",并定义了适当的关系,并且我只使用父级的一个删除-其他所有内容都被自动删除。父子关系的规则是在数据库模式中构建的,SQL server完成这项工作,我们可以认为这是安全的。