.net EF每次查询数据库

.net EF每次查询数据库,.net,sql-server,entity-framework,.net,Sql Server,Entity Framework,我有一个单一的数据上下文(创建一次),我使用它多次获取相同的数据库记录,例如,我获取指定相同产品ID的相同产品记录 比如说,每次调用context.Products.Single(p=>p.ProdID==1),context都会返回产品实体的相同实例,但每次都会查询数据库,这在SQL Server Profiler中是可见的 我通过修改调用之间的一些属性来检查它是否返回相同的实例。下一个调用返回具有修改属性的实例 为什么每次都要查询数据库?有没有办法避免这种情况?之所以这样做,是因为其他用户可

我有一个单一的数据上下文(创建一次),我使用它多次获取相同的数据库记录,例如,我获取指定相同产品ID的相同产品记录

比如说,每次调用context.Products.Single(p=>p.ProdID==1),context都会返回产品实体的相同实例,但每次都会查询数据库,这在SQL Server Profiler中是可见的

我通过修改调用之间的一些属性来检查它是否返回相同的实例。下一个调用返回具有修改属性的实例


为什么每次都要查询数据库?有没有办法避免这种情况?

之所以这样做,是因为其他用户可能在第一次和第二次调用之间修改了记录

如果数据是相对静态的,则考虑a。

您可以使用(
DbSet.Find
for
DbContext
)通过其键查询实体。此方法将检查具有指定键的对象是否已附加到上下文。如果是,它将返回该对象而不查询数据库。如果上下文中不存在,则运行数据库查询

LINQ查询通常查询数据库,不管对象是否已附加到上下文。EF无法预先知道对象是否已附加,因为它不知道查询的结果。从理论上讲,按键进行LINQ查询是一个例外,因为EF可以检查带有该键的对象是否已附加,因此可以知道该查询是否必要。但是这个异常并不是这样处理的-这就是为什么
GetObjectByKey
存在的原因-它像其他LINQ查询一样查询数据库


查询结果的结果由ObjectSet的属性决定。默认值为
AppendOnly
,这意味着如果带有键的对象已附加到上下文,则查询结果将被丢弃。查询不会覆盖或刷新任何内容。只有当上下文中不存在具有键的对象时,查询结果中的对象才会具体化并附加到上下文。您可以通过选择另一个
MergeOption

来更改此默认行为。这是否意味着如果另一个用户在我的调用之间修改记录,上下文将抛出我的更改并重新加载另一个用户修改的数据?这取决于您使用的并发模型。一般来说,最后一次编辑获胜,但如果其他用户在您尝试编辑时锁定了记录,则他们的编辑可能获胜。