EF ObjectStateManager无法跟踪具有相同键的多个对象 标签: EasyUIc# 2015-09-05 11:01 1181人阅读

   

   最近做一个项目,因为是重构,好多代码是搬过来的,但是因为框架不同,所以搬过来也出现了很多问题,前几天在调试的时候,就碰到一个EF框架经常出现的问题:ObjectStateManager中已存在具有同一键的对象。ObjectStateManager无法跟踪具有相同键的多个对象。


   为什么会报这个错呢?


   一般这个问题会出现在EF更新数据库时。我查了很多资料,大致产生这个问题的原因是当前上下文中已经包含了这一条记录,而且是出于被跟踪状态,所以不能再附加具有相同键的对象,通俗点解释就是:出错这个错误是因为使用了有跟踪状态的查询。


            


   如何解决这个问题?


   知道了问题产生的原因,那么只要找到对应的解决方法就好了,我看了很多博客,解决的方法也有很多,有的需要进行大的改动,有的不适合我的代码,找了半天,有一篇博客给我提供了思路,这一篇:Entity Framework中编辑时错误ObjectStateManager 中已存在具有同一键的对象 ,这篇博客的解决思路是 在查询时 加上asNoTracking() 即可,举个例子:


       db.Students.AsNoTracking().Single(x => x.Id ==Id);


    我的错误是报在要更新时的更新语句上,于是只好往前翻代码,检查前面的所有涉及到查询的功能代码,一共有两处,我不知道具体是哪个出了问题,于是都改了,改了以后,果然不再报错。




   红框框起来的是原来的代码,上面注释掉的是改后的代码,改好以后,继续测试,想要找出来到底是哪一句代码引出了这个问题,最后定位到确切的一句:




   最后在原来的代码基础上,去掉了tolist(),然后代码不报错了。


   虽然通过另外一种方法调试好了错误,我到现在也不明白为啥需要这么改,如果有懂的读者,请留言告诉我,谢谢!


posted @ 2015-09-05 11:01  kingsaytay  阅读(151)  评论(0编辑  收藏  举报