近期使用MVC4+EF5开发项目,做增删改查的时候经常会出现操作失败的问题,提示ObjectStateManager 无法跟踪具有相同键的多个对象。信息,经过几天的跟踪测试和网上查找一些相关资料发现是EF的缓存问题,在对数据集进行增删改查的时候,EF会把查询的对象缓存到DbContext中,所以当我们在将需要操作的对象附加到上下文中时就会出现冲突,出现此问题。
比如更新一个实体,如果之前进行过查询操作,EF就会缓存查询的实体,再进行更新时,先把要更新的实体附加到上下文,然后再标记为Modified状态,这时会出现上述问题
解决方案是:在查询的时候使用DbContext.AsNoTracking().Where(f => true).ToList();查询
下面是该方法的签名
// 摘要:
// 返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。
//
// 返回结果:
// 应用了 NoTracking 的新查询。
public DbQuery<TResult> AsNoTracking();
希望可以解决初学者的困扰
纯属个人观点,欢迎高手批评指正