2013-08-07 2 views
0

В моем приложении у меня есть метод, который обновляет значение элемента, как это:Данные модифицированные показывают старое значение при вызове после обновления

foreach (var orderDetailInfo in _order.mListOrderDetail) 
{ 
    OrderDetailInfo info = orderDetailInfo; 

    var inventoryQry = from i in db.INVENTORY 
         where i.INVENT_IDE == info.mInventoryID 
         select i; 

    INVENTORY originalItem = inventoryQry.Single(); 

    INVENTORY itemToModify = originalItem; 

    itemToModify.INVENT_NB_IN_STOCK = (orderDetailInfo.mOrderDetailQuantity + 
             originalItem.INVENT_NB_IN_STOCK); 

    db.Entry(originalItem).CurrentValues.SetValues(itemToModify); 

    db.SaveChanges(); 
} 

Теперь, если я смотрю в таблице на originalItem, это значение обновлено. Скажем, что перед обновлением его значение было 4, а order обновило количество до 5.

Моя проблема заключается в том, что когда я загружаю данные, подобные этому после запуска верхнего кода (поэтому после обновления столбца INVENT_NB_IN_STOCK):

var inventoryQry = from inv in db.INVENTORY 
        where inv.INVENT_IDE == inventIDE 
        select inv; 

return inventoryQry.Single(); 

элемент показывает последнее значение оно holded перед сборкой, а не текущее значение. В этом случае значение будет 4, а не 5. Почему? Может ли кто-нибудь помочь мне разобраться в моей проблеме?

Поскольку это может быть из-за огромного метода я делаю, я вывешиваю здесь весь метод, который содержит фрагмент кода отображается здесь:

internal void ValidateSupplierOrder(OrderInfo _order, List<OrderDetailInfo> _listOldOrderDetails) 
{ 
    using (BlueBerry_MTGEntities db = new BlueBerry_MTGEntities()) 
    { 
     using (TransactionScope scope = TransactionUtils.CreateTransactionScope()) 
     { 
      try 
      { 
       ORDERS orderToModify = DataConverter.OrderInfoToOrderDATA(_order); 

       var orderQry = from o in db.ORDERS 
           where o.ORDER_IDE == _order.mOrderID 
           select o; 

       ORDERS originalOrder = orderQry.Single(); 

       // First step: we need to remove the old order details as they are no more related 
       // To the order we are currently adding. 
       foreach (var orderDetail in _listOldOrderDetails) 
       { 
        OrderDetailInfo detail = orderDetail; 

        var orderDetailQry = from od in db.ORDER_DETAIL 
             where od.ORDER_DETAIL_IDE == detail.mOrderDetailID 
             select od; 

        ORDER_DETAIL itemToRemove = orderDetailQry.SingleOrDefault(); 

        db.ORDER_DETAIL.Remove(itemToRemove); 

        db.SaveChanges(); 
       } 

       foreach (ORDER_DETAIL orderDetailToCreate in _order.mListOrderDetail.Select(DataConverter.OrderDetailInfoToOrderDetailDATA)) 
       { 
        db.ORDER_DETAIL.Add(orderDetailToCreate); 

        db.SaveChanges(); 
       } 

       foreach (var orderDetailInfo in _order.mListOrderDetail) 
       { 
        OrderDetailInfo info = orderDetailInfo; 

        var inventoryQry = from i in db.INVENTORY 
             where i.INVENT_IDE == info.mInventoryID 
             select i; 

        INVENTORY originalItem = inventoryQry.Single(); 

        INVENTORY itemToModify = originalItem; 

        itemToModify.INVENT_NB_IN_STOCK = (orderDetailInfo.mOrderDetailQuantity + 
                 originalItem.INVENT_NB_IN_STOCK); 

        db.Entry(originalItem).CurrentValues.SetValues(itemToModify); 

        db.SaveChanges(); 
       } 

       db.Entry(originalOrder).CurrentValues.SetValues(orderToModify); 

       db.SaveChanges(); 
      } 
      catch(Exception ex) 
      { 
       throw new Exception(ex.Message); 
      } 

      scope.Complete(); 
     } 
    } 
} 
+0

Я вижу, что у вас первоначально было это помечено как 'asp.net-mvc'. Если вы просто делаете сообщение и возвращаете представление, значения могут быть кэшированы в вашем «ModelState». Вы можете попробовать очистить это или использовать шаблон Post/Redirect/Get. http://en.wikipedia.org/wiki/Post/Redirect/Get. – cadrell0

+0

Я попытался очистить модельное состояние, как вы предлагаете, затем я проверил, и наше приложение в основном построено на шаблоне Post/Redirect/Get (в основном). Тем не менее, значение GOOD отображается только тогда, когда проект перестроен, поэтому он меня озадачивает. – hsim

+0

Возможно, это потому, что я на самом деле пытаюсь изменить только поле объекта, но создать объект на основе 'originalItem'? – hsim

ответ

0

Ну, я выяснил этот вопрос, который был из-за ... моих собственных недостающих знаний!

Давайте возьмем эти строки кодов:

foreach (var orderDetailInfo in _order.mListOrderDetail) 
{ 
    OrderDetailInfo info = orderDetailInfo; 

    var inventoryQry = from i in db.INVENTORY 
         where i.INVENT_IDE == info.mInventoryID 
         select i; 

    INVENTORY originalItem = inventoryQry.Single(); 

    INVENTORY itemToModify = originalItem; 

    itemToModify.INVENT_NB_IN_STOCK = (orderDetailInfo.mOrderDetailQuantity + 
             originalItem.INVENT_NB_IN_STOCK); 

    db.Entry(originalItem).CurrentValues.SetValues(itemToModify); 

    db.SaveChanges(); 
} 

Моя догадка была (и есть), что-то шаблон я использую, чтобы изменить значение не было хорошим. Возможно, это было потому, что я копировал объект вместо создания нового и устанавливал фактические значения в то, что мне нужно.

Так что я сделал это:

foreach (var orderDetailInfo in _order.mListOrderDetail) 
{ 
    OrderDetailInfo info = orderDetailInfo; 

    var inventoryQry = from i in db.INVENTORY 
         where i.INVENT_IDE == info.mInventoryID 
         select i; 

    INVENTORY originalItem = inventoryQry.Single(); 

    int newStock = (int)(info.mOrderDetailQuantity + originalItem.INVENT_NB_IN_STOCK); 

    INVENTORY itemToModify = new INVENTORY 
     { 
      CARD_IDE = originalItem.CARD_IDE, 
      INVENT_IDE = originalItem.INVENT_IDE, 
      INVENT_ITEM_STATE = originalItem.INVENT_ITEM_STATE, 
      INVENT_NB_IN_STOCK = newStock, 
      INVENT_NB_QT_ADJUST = 0, 
      INVENT_NB_QT_EBAY_AUCTION = originalItem.INVENT_NB_QT_EBAY_AUCTION, 
      INVENT_NB_QT_EBAY_STORE = originalItem.INVENT_NB_QT_EBAY_STORE, 
      INVENT_NB_QT_FINEP = originalItem.INVENT_NB_QT_FINEP, 
      INVENT_NB_QT_SEND = 0, 
      INVENT_NB_QT_SOLD = originalItem.INVENT_NB_QT_SOLD 
     }; 

    db.Entry(originalItem).CurrentValues.SetValues(itemToModify); 

    db.Entry(originalItem).State = EntityState.Modified; 

    db.SaveChanges(); 
} 

И хотя это не кажется элегантным, это работает!

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