使用EF Code First本地扩展

本文关键字:扩展 First EF Code 使用 | 更新日期: 2023-09-27 17:59:42

以下方法在我的服务层中正常工作:

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;
       }

问题出在哪里?我该如何解决
如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?

使用EF Code First本地扩展

您看到的问题不对。您最可能看到的结果是,当您执行第一个查询时,本地缓存为空。所以它只返回查询的结果。但当您执行第二个查询时,它将返回第一个查询和第二个搜索的结果。

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

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

我不太确定您想用实现什么。Load方法,但似乎您想要以下内容。

public override IList<City> GetAll(Func<City, bool> predicate)
{
    return _tEntities.Where<City>(predicate).ToList();
}
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)是一个方法调用,并且方法调用可以这样使用,即使它们返回值。

这不是你唯一的问题(见其他答案),但我猜这个问题会导致你看到意想不到的结果。