畅想!!

馨园

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  

   EF 中 修改 有时会报错:

 

   

    An object with the same key already exists in the ObjectStateManager.

    The ObjectStateManager cannot track multiple objects with the same key.

    

     DbSet已经加载过一次对象了,当试图去attach另一个相同ID的对象的时候EF就会报错。

   

     解决方案如下:

 

   

    

        
using System.Data.Entity;
using System.Data.Objects;
using System.Data.Entity.Infrastructure;

 

 

public void Update(MyDbSet entity){

 

 1                 var _dc = (IObjectContextAdapter)context; // MyContext context=new MyContext(); MyContext 继承 DbContext
 2                 var _oc = _dc.ObjectContext;
 3 
 4                 var key = _oc.CreateEntityKey("MyDbSets", entity); //entity 为修改的对象

                   //MyDbSets 为 MyContext 中 public DbSet<MyDbSet> MyDbSets { get; set; }

 

 5                 ObjectStateEntry ose;
 6                 if (_oc.ObjectStateManager.TryGetObjectStateEntry(key, out ose))
 7                 {
 8                     var _entity = (MyDbSet)ose.Entity;
 9                     context.Entry(_entity).State = EntityState.Detached;

                       // Detached状态,就是entity还没有attach到context(实际上是Attach到某个DbSet上)的状态

                   }
11                 context.MyDbSets.Attach(entity);
12                 context.Entry(entity).State = EntityState.Modified;

10

 

 }

 

         

 

   


 

posted on 2012-07-20 14:44  阿乐01  阅读(1558)  评论(0编辑  收藏  举报