在WinForm系统中遇到了个问题,Form1是查询窗口,根据条件查询出所有数据,双击列表后创建弹出Form2窗口编辑单个记录,但编辑后保存后,在Form2中查询到的还是旧的数据,实际数据库中已经更新了,怀疑是4.2中加了查询缓存功能。

用ILSpy查看EntityFramework程序集,发现 System.Data.Entity.DbExtensions有个AsNoTracking的扩展方法,试了一下果然解决了。比如这样使用:

  var people = context.People.Where(p => p.PersonID > 100).AsNoTracking().ToList();

如果是取单个非追踪的实体,也可以这样:

return (from m in _dataContext.Monkeys.AsNoTracking()
        where m.MonkeyId == monkeyId
        select m).FirstOrDefault();

原来此举还能提高性能 :) 因为AsNoTracking后查询结构实体不被EF Context追踪,当然不追踪的实体也就不能用Update更新了,好在一般查询列表的也不需要更新。

关于AsNoTracking使用的问题,可以参看 LingzhiSun’s Blog 的这个POST(http://www.cnblogs.com/LingzhiSun/archive/2011/04/27/EF_Trick4.html)。

和这个Using DbContext in EF 4.1 Part 11: Load and AsNoTracking (http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx)

还有这个http://stackoverflow.com/questions/4911000/turn-off-object-caching-in-entity-framework-ctp5

再搜索了一下,有个同学在08年还专门做了个”Caching the results of LINQ queries

posted on 2013-05-08 17:06  swarb  阅读(199)  评论(0编辑  收藏  举报