C#实体框架Linq查询无法识别新更改

C#实体框架Linq查询无法识别新更改,c#,linq,entity-framework-4,C#,Linq,Entity Framework 4,我正在使用C#、.NET(4.0)和实体框架连接到SQLCE4.0 我查询了一些具有特定属性的对象,但只有当数据已保存到数据库中时,查询才会返回满足搜索条件的对象,这并没有什么问题,更大的问题是,如果数据已更改,但尚未保存到数据库中,它仍将满足搜索条件 示例: var query = from location in mainDBContext.Locations where location.InUse == true select locati

我正在使用C#、.NET(4.0)和实体框架连接到SQLCE4.0

我查询了一些具有特定属性的对象,但只有当数据已保存到数据库中时,查询才会返回满足搜索条件的对象,这并没有什么问题,更大的问题是,如果数据已更改,但尚未保存到数据库中,它仍将满足搜索条件

示例:

var query = from location in mainDBContext.Locations
            where location.InUse == true
            select location;
如果从DB加载时InUse为true,然后在以后的代码中更改,则此查询还返回location.InUse=false的对象

这是一个查询结果对象的屏幕截图

我真的不明白为什么会这样。我会理解这个查询是否总是查询数据库,并且我会得到这个对象的旧版本(因此InUse是正确的)


谢谢您的时间和回答。

我不确定您的问题到底是什么,但我想您必须知道:

  • 这种查询总是返回提交到数据库中的数据。当您更改代码中的某些实体但它们未提交到数据库中时,LINQ查询将从数据库中查询数据,而不会更改代码中的内容

  • LINQ查询使用延迟执行,因此“query”变量不是结果列表,它只是一个查询定义,每次需要结果时都会对其进行评估。您应该添加
    .ToList()
    ,以计算该查询并获得该特定代码行中的结果列表

.ToList()
的一个示例:


这就是EF内部的工作方式

上下文只能跟踪由其键唯一标识的每个实体一次-。因此,执行查询多少次并不重要。如果查询返回被跟踪的实体,并且在同一上下文实例上重复执行,则它将始终返回同一实例


如果在应用程序中修改了实例,但未将其保存到数据库中,则将在数据库上执行查询,其中将评估持久化状态,但在默认情况下,物化过程将使用来自应用程序的当前数据,而不是从数据库检索的数据。您可以强制查询从数据库返回状态(通过设置
mainDBContext.Locations.MergeOption=MergeOption.OverwriteChagens
),但由于标识映射,您当前的修改将丢失

我自己也遇到了同样的事情。这有点混乱,但另一个选择是检查本地缓存。您可以这样做,例如:

var query = from location in mainDBContext.Locations.Local
            where location.InUse == true
            select location;

这将只使用未保存到数据库的本地缓存。本地查询和数据库查询的组合应能使您获得所需信息。

谢谢您的回答。是否可以对本地数据执行查询?。
var query = from location in mainDBContext.Locations.Local
            where location.InUse == true
            select location;