Entity framework 使用实体框架刷新数据

Entity framework 使用实体框架刷新数据,entity-framework,Entity Framework,我正在尝试使用实体框架来查询数据库,我有以下代码用于获取一些数据 var students= MyEntities.Students.Where(s => s.Age > 20).ToList(); 此代码工作正常,并返回正确的数据。但是,如果我运行此代码,然后转到数据库并更新记录以更改此代码应返回的数据,然后在不关闭应用程序的情况下重新运行此代码,我将获得原始数据。 我很确定它以前工作正常,但现在无法刷新数据。您遇到了问题,因为EF缓存数据,因此如果数据在幕后更改,而您不处理/重

我正在尝试使用实体框架来查询数据库,我有以下代码用于获取一些数据

var students= MyEntities.Students.Where(s => s.Age > 20).ToList();
此代码工作正常,并返回正确的数据。但是,如果我运行此代码,然后转到数据库并更新记录以更改此代码应返回的数据,然后在不关闭应用程序的情况下重新运行此代码,我将获得原始数据。
我很确定它以前工作正常,但现在无法刷新数据。

您遇到了问题,因为EF缓存数据,因此如果数据在幕后更改,而您不处理/重新打开您的上下文,您将遇到问题

一般的经验法则是尽可能缩短上下文的生命周期,以避免您刚才提到的问题


请不要忽视我上面所说的,但如果您想强制数据库刷新,您可以使用该方法。

不,它从未起作用。这是名为identity map()的实体框架(和许多ORM工具)的基本行为

如果在同一上下文上运行查询,则不会更新实体。它只会在运行这两个查询之间追加在数据库中创建的新实体。如果要强制EF重新加载实体,必须执行以下操作:

ObjectQuery query = MyEntities.Students;
query.MergeOption = MergeOption.OverwriteChanges;
var students = query.Where(s => s.Age > 20).ToList();

如果您只是查询,您应该使用
MergeOption.NoTracking
?这将迫使查询命中数据库。查询仍将命中数据库。我不确定当您使用
NoTracking
并且“缓存”中已经有实体时会发生什么,因为当使用延迟加载时,EF仍然保留实体。这似乎是我希望它做的。使用Refresh()方法也可以,但我认为使用ObjectQuery是一个更干净的解决方案。将此标记为答案。然而,Nix在使用EF的最佳实践方面提出了一个很好的观点,这将有助于了解更多信息,因此我需要对此进行更多的研究。请注意,除了可能执行或可能不执行的实际查询之外,refresh还为更大的数据集执行许多查询,而query.MergeOption只是强制从数据库读取查询