使用EF 6和存储库执行删除的最佳方法是什么?

时间:2014-02-16 20:21:04

标签: sql-server entity-framework entity-framework-6

我正在从两个不同的存储库中查看这两个示例:

    public virtual void Delete(T entity)
    {
        DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);
        }
    }

   public virtual void Delete(T entity) {
        dbset.Remove(entity);
   }

有人可以解释这个区别。为什么第一个作者添加了所有额外的行?

1 个答案:

答案 0 :(得分:1)

  

使用EF 6和存储库执行删除的最佳方法是什么?

我无法回答你的问题。这就是原因。

如果你想通过Entity Framework删除一个对象,那么必须要做两件事:

  • 必须将对象附加到上下文中。
  • 对象必须处于Deleted状态。

第一个 Delete方法的目的似乎是确保在运行后满足这两个条件。但这并不像看起来那么简单。它必须嗅出对象的当前状态,必要时附加它,必要时设置其状态。并且,甚至还没有解释,它还必须确保它不附加到任何其他上下文。这和Anthony Chu的评论表明,第一种方法还不够复杂。

所以保持简单并使用第二个方法?好吧,第二种方法假定调用代码知道只调用dbset.Remove就可以了,它知道第一种方法试图找出的所有东西。但如果它已经那么聪明了,为什么它太愚蠢也直接打电话给DbSet.Remove? (正如Timothy Walters所指出的那样,第二种方法本身非常愚蠢)。

然后,有三种方法可以将对象标记为Deleted

  • Remove来自DbSet
  • DbEntityEntry的状态标记为Deleted
  • (在某些条件下)Remove来自父母的子集合

尝试将所有删除限制在调用一个存储库方法可能是编写最佳代码的一个很大的限制。

这就是为什么我无法回答你的问题。无论如何,我不相信DbSet之上的存储库层。对我来说,执行删除的最佳方法取决于每个用例的代码是什么样的。