2011-06-01 6 views
1

У меня очень странная ошибка, которая, похоже, происходит только в определенном элементе, который я пытаюсь обновить в БД, используя сущность framework.EF не обновляет конкретный объект в SaveChanges

Вот мой код:

var shoppingCartItem = GetShoppingCartItemById(shoppingCartItemId); 
shoppingCartItem.Quantity = newQuantity; 
_context.SaveChanges(); 

и это метод, который получает элемент из БД, прежде чем updateing:

public ShoppingCartItem GetShoppingCartItemById(int shoppingCartItemId) 
     { 
      if (shoppingCartItemId == 0) 
       return null; 


      var query = from sci in _context.ShoppingCartItems 
         where sci.ShoppingCartItemId == shoppingCartItemId 
         select sci; 
      var shoppingCartItem = query.SingleOrDefault(); 
      return shoppingCartItem; 
     } 

Этот код работает на некоторых деталях, но не на конкретный, с которым я сейчас тестирую. Если я проверю состояние объекта (с помощью _context.ObjectStateManager.GetObjectStateEntry (shoppingCartItem)) после изменения свойства Количество его не изменяется :(

Это случается с любым из вас? Любая идея, почему это происходит это должно быть причиной этого?

+1

Вы уверены, что количество нового продукта больше? –

ответ

0

У меня была аналогичная проблема при передаче объекта данных в представление, а затем возврат его обратно - в этом случае он разрывает ссылку на datacontext. В этом случае это не должно происходить, но установка EntityState для модификации и повторного прикрепления это сработало для меня, возможно, стоит попробовать.

var shoppingCartItem = GetShoppingCartItemById(shoppingCartItemId); 
shoppingCartItem.Quantity = newQuantity; 


_context.Entry(shoppingCartItem).State = System.Data.EntityState.Modified; 

_context.SaveChanges(); 

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

+0

ссылка на контекст не нарушена, в противном случае GetObjectStateEntry сообщит об отдельном, а не неизмененном. –

+0

для записи, вы можете пометить объект как грязный в любом EF vesion: _context.ObjectStateManager.ChangeObjectState (object, System.Data.EntityState.Modified); –

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