2013-07-30 2 views
2

Мой код выглядит следующим образом: (где «пользователь» является экземпляр UserProfile передается обратно с точки зрения после того, как редактируется)MVC4 Ef5 Изменения не сохраняются в БД

UserProfile original = DBContext.UserProfiles.Where(x => x.UserId == user.UserId).FirstOrDefault(); 
if (original != null) 
{ 
    original = user; 
    DAL.DAL.Instance.TGIMobiledb.SaveChanges(); 
} 

Этот код срабатывает без ошибок, но не обновить БД. После некоторых исследований, кажется, я должен добавить следующую строку перед вызовом SaveChanges()

DBContext.Entry(original).State = EntityState.Modified; 

Но эта строка кода вызывает эту ошибку:.
«Объект с тем же ключом уже существует в ObjectStateManager ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом ".

Изменения сохраняются в БД штрафа, если я назначу каждое поле вручную, как это:

original.UserId = user.UserId; 
original.FirstName = user.FirstName; 
original.Surname = user.Surname; 
original.UserName = user.UserName; 

Очевидно, что это меньше, чем оптимальный, особенно с крупными структурами.

+0

Здесь http://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record хорошее обсуждение сценариев обновления объектов в EF5. –

ответ

1

Try:

DBContext.Entry(original).CurrentValues.SetValues(user); 
+0

Работал как шарм! Спасибо, хаим! – Swifty

0

Я предполагаю, что вы извлекаете пользователя и проверить нуль, чтобы увидеть, если вам нужно создать или обновить его.

Вместо этого вы можете проверить поле UserId.

if (user.UserId == 0) 
{ 
    DBContext.UserProfiles.Add(user); 
} 
else 
{ 
    DBContext.UserProfiles.Attach(user); 
    DBContext.Entry(user).State = EntityState.Modified; 
} 
Смежные вопросы