2016-09-19 44 views
0

我要更新記錄,但計劃抓住這個錯誤錯誤當更新紀錄的EntityFramework

具有相同鍵的對象已經存在於ObjectStateManager。該ObjectStateManager無法跟蹤多個對象使用相同的密鑰。」

這是我的代碼

public bool Update(User item, HttpPostedFileBase avatar) 
{ 
    var tran = ContextEntities.Database.BeginTransaction(IsolationLevel.ReadUncommitted); 
    try 
    { 
     var user = new UserDa().Get(ContextEntities, item.Id);//get current user 
     CheckConstraint(item, Enums.Status.Update); 
     //avatar checker 
     if (avatar != null) 
     { 
      if (avatar.ContentType != "image/jpeg") 
       throw new Exception("[Only Jpg Is Allowed"); 

      if (user.AvatarId == null) 
      { 
       item.AvatarId = new FileDa().Insert(ContextEntities, avatar); 
      } 
      else if (user.AvatarId != null) 
      { 
       item.AvatarId = new FileDa().Update(ContextEntities, (Guid)user.AvatarId, avatar); 
      } 
     } 
     //password checker 
     item.Password = string.IsNullOrWhiteSpace(item.Password) ? user.Password : Utility.Hash.Md5(item.Password); 
     ContextEntities.Entry(item).State = EntityState.Modified; 
     if (!new UserDa().Update(ContextEntities, item)) 
      throw new Exception(); 
     tran.Commit(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     tran.Rollback(); 
     throw new Exception(ex.Message); 
    } 
} 

,這是我更新方法UserDa

public bool Update(PortalEntities contextEntities, User item) 
{ 
    var res = contextEntities.SaveChanges() > 0; 
    return res; 
} 

爲什麼顯示的錯誤,並我怎樣才能修復它?

+0

可能是因爲實例'item'已經被追蹤,現在您檢索或行中添加重複的實例'VAR用戶=新UserDa()獲取(ContextEntities,item.Id); //獲取當前user'。只是猜測,因爲你不提供這種方法的代碼。 – Igor

回答

0

我相信伊戈爾是正確的。要解決這個問題,當用戶已經存在於數據庫然後更新用戶屬性而不是項目屬性。刪除代碼行「ContextEntities.Entry(item).State = EntityState.Modified;」並保存更改。

public bool Update(User item, HttpPostedFileBase avatar) 
{ 
    var tran = ContextEntities.Database.BeginTransaction(IsolationLevel.ReadUncommitted); 
    try 
    { 
     var user = new UserDa().Get(ContextEntities, item.Id);//get current user 
     CheckConstraint(item, Enums.Status.Update); 

     if(user == null) 
     { 
      //throw and error or do something else 
     }} 

     //avatar checker 
     if (avatar != null) 
     { 
      if (avatar.ContentType != "image/jpeg") 
       throw new Exception("[Only Jpg Is Allowed"); 

      if (user.AvatarId == null) 
      { 
       user.AvatarId = new FileDa().Insert(ContextEntities, avatar); 
      } 
      else if (user.AvatarId != null) 
      { 
       user.AvatarId = new FileDa().Update(ContextEntities, (Guid)user.AvatarId, avatar); 
      } 
     } 
     //password checker 
     user.Password = string.IsNullOrWhiteSpace(item.Password) ? user.Password : Utility.Hash.Md5(user.Password); 
     //ContextEntities.Entry(item).State = EntityState.Modified; 
     if (!new UserDa().Update(ContextEntities, user)) 
      throw new Exception(); 
     tran.Commit(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     tran.Rollback(); 
     throw new Exception(ex.Message); 
    } 
} 
+0

此外,請務必更新可能已經更新了項目的任何其他用戶屬性。 AutoMapper對這類事情很好。 – Sooey