私のアプリには、次のようなアイテムの値を更新するメソッドがあります。
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();
アイテムには、現在の値ではなく、ビルド前に保持されていた最後の値が表示されます。この場合、値は 5 ではなく 4 になります。誰でも私の問題を理解するのを手伝ってもらえますか?
私が作成した巨大なメソッドが原因である可能性があるため、ここに表示されているコードのチャンクを含むメソッド全体をここに投稿します。
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();
}
}
}