我正在从两个不同的存储库中查看这两个示例:
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);
}
有人可以解释这个区别。为什么第一个作者添加了所有额外的行?
答案 0 :(得分:1)
使用EF 6和存储库执行删除的最佳方法是什么?
我无法回答你的问题。这就是原因。
如果你想通过Entity Framework删除一个对象,那么必须要做两件事:
Deleted
状态。 第一个 Delete
方法的目的似乎是确保在运行后满足这两个条件。但这并不像看起来那么简单。它必须嗅出对象的当前状态,必要时附加它,必要时设置其状态。并且,甚至还没有解释,它还必须确保它不附加到任何其他上下文。这和Anthony Chu的评论表明,第一种方法还不够复杂。
所以保持简单并使用第二个方法?好吧,第二种方法假定调用代码知道只调用dbset.Remove
就可以了,它知道第一种方法试图找出的所有东西。但如果它已经那么聪明了,为什么它太愚蠢也直接打电话给DbSet.Remove
? (正如Timothy Walters所指出的那样,第二种方法本身非常愚蠢)。
然后,有三种方法可以将对象标记为Deleted
:
Remove
来自DbSet
DbEntityEntry
的状态标记为Deleted
Remove
来自父母的子集合尝试将所有删除限制在调用一个存储库方法可能是编写最佳代码的一个很大的限制。
这就是为什么我无法回答你的问题。无论如何,我不相信DbSet
之上的存储库层。对我来说,执行删除的最佳方法取决于每个用例的代码是什么样的。