1

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

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

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

4

1 回答 1

2

是的,我在自己的应用程序中遇到了这个问题。

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先前查询的任何对象的属性。

于 2012-05-03T00:58:11.920 回答