EF每次都查询数据库

时间:2012-06-25 22:48:02

标签: .net sql-server entity-framework

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

每次我调用时,假设context.Products.Single(p => p.ProdID == 1),context返回产品实体的同一个实例,但每次都查询数据库,这在SQL Server Profiler中可见。

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

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

2 个答案:

答案 0 :(得分:2)

这样做是因为其他用户可能在第一次和第二次通话之间修改了记录。

如果数据相对静态,请考虑caching solution

答案 1 :(得分:1)

您可以使用ObjectContext.GetObjectByKeyDbSet<T>.Find DbContext)来查询实体的密钥。此方法将检查具有指定键的对象是否已附加到上下文。如果是,它将返回该对象而不查询数据库。如果它在上下文中不存在,则运行数据库查询。

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

查询结果会发生什么,由ObjectSet的MergeOption确定。默认值为AppendOnly,这意味着如果具有键的对象已附加到上下文,则会丢弃查询结果。查询不会覆盖或刷新任何内容。仅当具有键的对象在上下文中不存在时,才会实现查询结果中的对象并将其附加到上下文。您可以通过选择其他MergeOption来更改此默认行为。