我不知道怎么说这个。我有一个ASP.NET MVC 3 Web应用程序,它具有非常标准的EF 4.1代码,首先是现有数据库(非自动生成)存储库模式。 Web应用程序与之对话的数据服务有一个上下文。
我遇到的问题是:说我有一个带整数列的数据库表。值为10.如果我进入数据库本身并在表中输入25,无论我在浏览器上点击多少次,关闭浏览器并重新打开它,清除浏览器历史记录等,它仍然保持值10.我必须重新发布该网站。
为什么这样做?我在这里责备正确的事吗?这是一个EF问题吗?一个ASP.NET问题?服务器问题? ......我不知道在哪里看这个。
答案 0 :(得分:2)
是的,我在自己的应用程序中遇到了这个问题。
实体框架跟踪的“实体”(对象实例)缓存在内存中,并且在您重新查询数据库时不会更新,以防覆盖它们会破坏您对缓存版本所做的任何更改。
您可以通过强制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
个对象的属性。