是的,我在自己的应用程序中遇到了这个问题。
Entity Framework 跟踪的“实体”(对象实例)缓存在内存中,并且在您重新查询数据库时不会更新,以防覆盖它们会破坏您对缓存版本所做的任何更改。
您可以通过强制 EF 覆盖现有值来绕过它,但请注意,这将覆盖您已更改的任何内容,因此只有在您知道已先保存任何待处理的更改时才这样做。
我编写了这个扩展方法来完成这项工作:
public static class DbSetExtensions
{
public static System.Data.Objects.ObjectSet<T> Uncached<T>(this IObjectContextAdapter context)
where T : class
{
var set = context.ObjectContext.CreateObjectSet<T>();
set.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges;
return set;
}
}
所以使用它,我可以说:
var orders = myDbContext.Uncached<Order>().Where(...);
...并且该orders
集合将包含来自数据库的新订单,覆盖Order
先前查询的任何对象的属性。