我正在尝试使用Entity Framework来查询数据库,我有以下代码用于获取一些数据。
var students= MyEntities.Students.Where(s => s.Age > 20).ToList();
此代码工作正常并返回正确的数据。但是,如果我运行此代码,然后转到数据库并更新记录以更改此代码应返回的数据,然后重新运行此代码而不关闭应用程序,我将获得原始数据。 我很确定它曾经工作正常,但现在这不会刷新数据。
答案 0 :(得分:16)
不,它从未奏效。这是称为身份映射(explanation here)的实体框架(以及许多ORM工具)的基本行为。
如果在同一上下文中运行查询,则不会更新实体。它只会在运行这两个查询之间附加在数据库中创建的新实体。如果要强制EF重新加载实体,则必须执行以下操作:
ObjectQuery query = MyEntities.Students;
query.MergeOption = MergeOption.OverwriteChanges;
var students = query.Where(s => s.Age > 20).ToList();
答案 1 :(得分:6)
由于EF缓存数据,您遇到了问题,因此如果数据在幕后发生变化,并且您没有处置/重新打开您的上下文,那么您将遇到问题。
一般的经验法则是尽可能缩短上下文的生命周期,以规避您刚才提到的问题。
请不要忽视我上面所说的内容,但如果您想强制从数据库刷新,可以使用Refresh()方法。