使用EF Code First Local扩展

时间:2013-02-15 23:43:45

标签: c# entity-framework ef-code-first local first-level-cache

以下方法在我的服务层中正常运行:

public override IList<City> GetAll()
 {
           var query = from item in _tEntities
                       select item;
           query.Load();
           return _tEntities.Local;
 }

但是当我尝试运行以下方法时,该方法返回由GetAll()方法加载的旧数据。

public override IList<City> GetAll(Func<City, bool> predicate)
       {
           var query = from item in _tEntities
                       select item;
           query.Where<City>(predicate);
           query.Load();
           return _tEntities.Local;
       }

问题是什么?如何解决? 如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?

3 个答案:

答案 0 :(得分:1)

你正在看错了问题。您最有可能看到的是,当您执行第一个查询时,本地缓存为空。因此它只返回查询结果。但当你做第二个时,它会返回你的第一个查询和第二个查询的结果。

这归结为您在所有方法之间使用共享DbContext的事实。 Local包含上下文检索的所有记录的缓存,而不仅仅是最新的查询。

正确的解决方案是不要以这种方式使用Local。更好的是,不要使用共享上下文,因为这会导致上下文缓存膨胀。

答案 1 :(得分:0)

我不太确定你在这里使用.Load方法想要实现什么,但似乎你想要以下内容。

public override IList<City> GetAll(Func<City, bool> predicate)
{
    return _tEntities.Where<City>(predicate).ToList();
}

答案 2 :(得分:0)

query.Where<City>(predicate);

这不会改变query。下一行的query.Load()会忽略谓词:您正在调用query.Load()而不是query.Where<City>(predicate).Load()。这就像你写的那样

int i = 3;
i + 1;
Console.WriteLine(i); // still prints 3

在该示例中,C#实际上并不真正允许将添加用作语句,但.Where(predicate)是方法调用,并且方法调用可以这样使用,即使它们返回值。

这不是你唯一的问题(请参阅其他答案),但我的猜测是,这个问题导致了你所看到的意外结果。