首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EF代码优先本地扩展

使用EF代码优先本地扩展
EN

Stack Overflow用户
提问于 2013-02-16 07:43:45
回答 3查看 88关注 0票数 0

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

代码语言:javascript
复制
public override IList<City> GetAll()
 {
           var query = from item in _tEntities
                       select item;
           query.Load();
           return _tEntities.Local;
 }

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

代码语言:javascript
复制
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;
       }

问题出在哪里?我该如何解决它们?

如何在此示例中使用本地方法并将新数据重新加载到本地(缓存)?

EN

回答 3

Stack Overflow用户

发布于 2013-02-16 07:50:17

你看错问题了。您最可能看到的是这样一个事实:当您执行第一个查询时,本地缓存是空的。因此,它只返回查询的结果。但当您执行第二个查询时,它将返回第一个查询和第二个查询的结果。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-16 07:48:32

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

代码语言:javascript
复制
public override IList<City> GetAll(Func<City, bool> predicate)
{
    return _tEntities.Where<City>(predicate).ToList();
}
票数 0
EN

Stack Overflow用户

发布于 2013-02-16 08:01:42

query.Where(谓词);

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

int i= 3;i+ 1;Console.WriteLine(i);//仍打印3

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14905198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档