使用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;
}
问题出在哪里?我该如何解决
如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?
您看到的问题不对。您最可能看到的结果是,当您执行第一个查询时,本地缓存为空。所以它只返回查询的结果。但当您执行第二个查询时,它将返回第一个查询和第二个搜索的结果。
这归结为您在所有方法之间使用共享的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)
是一个方法调用,并且方法调用可以这样使用,即使它们返回值。
这不是你唯一的问题(见其他答案),但我猜这个问题会导致你看到意想不到的结果。