【问题标题】:Should I write removal operation handling or let cascade do the job?我应该编写删除操作处理还是让级联来完成这项工作?
【发布时间】:2015-08-11 13:55:31
【问题描述】:

我正在使用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 约定指定自动应用级联 (older question)):

//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 关系的任何列表许可,因为这应该自动完成。

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

【问题讨论】:

    标签: c# entity-framework refactoring code-first


    【解决方案1】:

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

    我使用 EF 6 'code first' 并定义了正确的关系,并且我只使用了一次删除父项 - 其他所有内容都会自动删除。父子关系的规则建立在数据库模式中,SQL Server 完成这项工作,我们可以认为这是安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2013-03-27
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多