В моем приложении у меня есть метод, который обновляет значение элемента, как это:Данные модифицированные показывают старое значение при вызове после обновления
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();
}
}
}
Я вижу, что у вас первоначально было это помечено как 'asp.net-mvc'. Если вы просто делаете сообщение и возвращаете представление, значения могут быть кэшированы в вашем «ModelState». Вы можете попробовать очистить это или использовать шаблон Post/Redirect/Get. http://en.wikipedia.org/wiki/Post/Redirect/Get. – cadrell0
Я попытался очистить модельное состояние, как вы предлагаете, затем я проверил, и наше приложение в основном построено на шаблоне Post/Redirect/Get (в основном). Тем не менее, значение GOOD отображается только тогда, когда проект перестроен, поэтому он меня озадачивает. – hsim
Возможно, это потому, что я на самом деле пытаюсь изменить только поле объекта, но создать объект на основе 'originalItem'? – hsim