Entity framework 为什么EntityFramework.ExtendedLibrary不';更新和删除时不需要调用SaveChanges()?
我正在看。它可以在db实体上运行Update()和Delete()。比如:Entity framework 为什么EntityFramework.ExtendedLibrary不';更新和删除时不需要调用SaveChanges()?,entity-framework,design-patterns,ado.net,Entity Framework,Design Patterns,Ado.net,我正在看。它可以在db实体上运行Update()和Delete()。比如: //delete all users where FirstName matches context.Users.Delete(u => u.FirstName == "firstname"); 但有趣的是,它不需要调用context.SaveChanges(),它只需直接进入数据库并删除记录 这是一个糟糕的设计吗?我认为对实体的每次修改都需要调用SaveChanges()才能生效,并保持数据库和内存对象之间的正
//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName == "firstname");
但有趣的是,它不需要调用context.SaveChanges()
,它只需直接进入数据库并删除记录
这是一个糟糕的设计吗?我认为对实体的每次修改都需要调用
SaveChanges()
才能生效,并保持数据库和内存对象之间的正确关系和映射。这在自述文件中有解释。如果您知道要删除的内容,并且需要删除多个实体,那么只需转到数据库并删除这些实体,而不是将它们带到上下文中删除这些实体,速度会更快。这类似于使用ExecuteSqlCommand执行SQL命令,但您在这里看不到SQL。另一方面,如果您的上下文正在跟踪您正在删除/更新的实体,那么您很可能会看到一些异常,因此您需要知道您正在做什么,为什么要这样做,以及何时这样做。您必须了解SaveChanges做了什么。SaveChanges提交存储在当前本地缓存中的对象模型更改
您所引用的库生成SQL命令语句,并且不修改对象上下文。因此,由于对象上下文没有更改,因此没有要保存的更改(换句话说,SaveChanges指的是数据模型,而不是数据库)
为了说明这一点。。。想象一下,你的孩子坐公共汽车上学,而你让他们下车,两者之间的区别
当他们乘校车去学校时,校车会开到各个车站,然后当车停下来时,所有的孩子都会立刻下车。这有点像调用SaveChanges
但是,当你把孩子送到学校时,这是一项在你做这件事的时候用一个动作就能完成的单一任务。你可能知道这是一个开源库,请检查它的源代码以了解原因。谢谢你的回答,跟踪实体是我所担心的。我担心一旦调用Delete(),数据库中的记录就被删除了,但EF不知道它被删除了,所以它仍然会在内存中保留错误的实体。