Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 为什么EntityFramework.ExtendedLibrary不';更新和删除时不需要调用SaveChanges()?_Entity Framework_Design Patterns_Ado.net - Fatal编程技术网

Entity framework 为什么EntityFramework.ExtendedLibrary不';更新和删除时不需要调用SaveChanges()?

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()才能生效,并保持数据库和内存对象之间的正

我正在看。它可以在db实体上运行Update()和Delete()。比如:

//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不知道它被删除了,所以它仍然会在内存中保留错误的实体。