2016-09-19 3 views
0

Я хочу обновить улов Записи Но Program Этой ошибкуОшибка при обновлении записи с EntityFramework

Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с тем же ключом.»

This Is My коды

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); 
    } 
} 

и это мой метод Update В UserDa Класс

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

Почему Показаны ошибки и Как я могу это исправить?

+0

Вероятно потому, что экземпляр 'item' уже отслеживаются и теперь вы запрашиваете или добавить дубликат экземпляра в строке' уаг пользователя = новые UserDa() Get (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

Смежные вопросы