2013-02-15 94 views
0

下面的方法正常工作在我的服务层:使用EF代码优先本地extention

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

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

+0

难道你不应该'返回查询;'? – 2013-02-15 23:51:17

回答

0

我也不太清楚,你正在努力实现与.Load方法在这里是什么,但它似乎是你想要的下面。

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

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

这归结为一个事实,即所有正在使用的方法之间共享的DbContext。本地包含上下文检索的所有记录的缓存,而不仅仅是最近的查询。

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

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)是一个方法调用,方法调用可以作为这样,即使他们返回值。

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