在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”