实体框架不会更新数据库所做的数据值更改

时间:2012-05-03 00:49:45

标签: asp.net-mvc entity-framework

我不知道怎么说这个。我有一个ASP.NET MVC 3 Web应用程序,它具有非常标准的EF 4.1代码,首先是现有数据库(非自动生成)存储库模式。 Web应用程序与之对话的数据服务有一个上下文。

我遇到的问题是:说我有一个带整数列的数据库表。值为10.如果我进入数据库本身并在表中输入25,无论我在浏览器上点击多少次,关闭浏览器并重新打开它,清除浏览器历史记录等,它仍然保持值10.我必须重新发布该网站。

为什么这样做?我在这里责备正确的事吗?这是一个EF问题吗?一个ASP.NET问题?服务器问题? ......我不知道在哪里看这个。

1 个答案:

答案 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个对象的属性。