针对【ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。】的解决方案

       近期使用MVC4+EF5开发项目,做增删改查的时候经常会出现操作失败的问题,提示ObjectStateManager 无法跟踪具有相同键的多个对象。信息,经过几天的跟踪测试和网上查找一些相关资料发现是EF的缓存问题,在对数据集进行增删改查的时候,EF会把查询的对象缓存到DbContext中,所以当我们在将需要操作的对象附加到上下文中时就会出现冲突,出现此问题。

      比如更新一个实体,如果之前进行过查询操作,EF就会缓存查询的实体,再进行更新时,先把要更新的实体附加到上下文,然后再标记为Modified状态,这时会出现上述问题

解决方案是:在查询的时候使用DbContext.AsNoTracking().Where(f => true).ToList();查询

下面是该方法的签名

        // 摘要:
        //     返回一个新查询,其中返回的实体将不会在 System.Data.Entity.DbContext 中进行缓存。
        //
        // 返回结果:
        //     应用了 NoTracking 的新查询。
        public DbQuery AsNoTracking();

希望可以解决初学者的困扰

纯属个人观点,欢迎高手批评指正

你可能感兴趣的:(.net技术交流)