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();

アイテムには、現在の値ではなく、ビルド前に保持されていた最後の値が表示されます。この場合、値は 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();
        }
    }
}
4

1 に答える 1

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();
}

エレガントに見えませんが、機能します。

于 2013-08-08T13:52:49.953 に答える