为什么EntityFramework.Extended库在更新和删除时不需要调用SaveChanges()?

时间:2012-12-09 09:24:57

标签: entity-framework design-patterns ado.net

我在看EntityFramework.Extended。它可以在db实体上运行Update()和Delete()。像:

//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName == "firstname");

但有趣的是,它不需要调用context.SaveChanges(),它只是直接进入数据库并删除记录。

这是一个糟糕的设计吗?我认为实体上的每个修改都需要调用SaveChanges()才能生效并保持数据库和内存对象之间的正确关系和映射。

2 个答案:

答案 0 :(得分:4)

您必须了解SaveChanges的作用。 SaveChanges提交存储在当前本地缓存中的对象模型更改。

您指的库生成SQL命令语句,不修改对象上下文。因此,由于对象上下文没有改变,因此没有保存的更改(换句话说,SaveChanges指的是数据模型,而不是数据库)。

为了说明这一点......想象一下你的孩子乘坐公共汽车去学校之间的区别,以及你把他们送走。

当他们乘公共汽车去学校时,校车开到各个站点,然后当它完成后,公共汽车立即将所有孩子放下。这有点像调用SaveChanges。

但是,当你带着孩子离开学校时,这是一项单一的任务,只需一次就可以完成。

答案 1 :(得分:1)

自述文件中对此进行了解释。 https://github.com/loresoft/EntityFramework.Extended。如果您知道要删除的内容并且需要删除多个实体,那么只需转到数据库并删除它们,而不是将它们带到上下文中以删除它们。这就像使用ExecuteSqlCommand执行SQL命令,但是你没有在这里看到SQL。另一方面,如果您的上下文是跟踪正在删除/更新的实体,您很可能最终会看到一些异常,因此您需要知道自己在做什么,为什么要这样做以及何时这样做。