0

私のアプリでは、注文とその内容をすべて検証する必要があります。

注文ベースは次のような形をしています。

public class OrderInfo
{
    public int Order_ID { get; set; }

    (...)

    public List<OrderDetailInfo> ListOrderDetails { get; set; }
}

他のすべてのフィールドは、請求先住所、注文合計などの単純なフィールドです。

これらの注文の詳細を注文にリンクするには、注文の詳細クラスを次に示します。

public class OrderDetailInfo
{
    public int OrderDetail_ID { get; set; }
    public int Order_ID { get; set; }
    public int InventoryID { get; set; }
    public int OrderDetailQuantity { get; set; }

    public OrderInfo Order { get; set; }
    public InventoryInfo Inventory { get; set; }
}

ご覧のとおり、注文明細も在庫品目にリンクされています。したがって、アイテムを売買する注文を渡すと、その数量が増減します。

さて、ここまで来ましたので、InventoryInfo クラスを次に示します。

public class InventoryInfo
{
    public int Inventory_ID { get; set; }

    public int  Object_ID { get; set; }

    public ObjectInfo Object { get; set; }

    public int  Inventory_Nb_In_Stock { get; set; }
    (...)
}

したがって、3 つのクラスすべてに基づいて、注文の内容を検証し、注文の詳細に関連する各アイテムの数量を更新する必要があるこのメソッドがあります。

手順は次のとおりです。

internal void ValidateSupplierOrder(OrderInfo _order, List<OrderDetailInfo> _listOldOrderDetails)
{
    var orderQry = from o in mDb.OrderInfo
               where o.Order_ID  == _order.Order_ID 
               select o;

    OrderInfo originalOrder = orderQry.Single();

    foreach (var orderDetailInfo in _order.ListOrderDetails )
    {
        mDb.OrderDetailInfo.Add(orderDetailInfo);

        mDb.SaveChanges();
    }

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

        var inventoryQry = from i in mDb.InventoryInfo
                           where i.Inventory_ID  == info.Inventory_ID 
                           select i;

        InventoryInfo originalItem = inventoryQry.Single();

        InventoryInfo itemToModify = originalItem;

        itemToModify.Inventory_Nb_In_Stock  += orderDetailInfo.OrderDetailQuantity;

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

        mDb.SaveChanges();
    }

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

    mDb.SaveChanges();
}

プロセスの進行中に (デバッグ モードで) データベース テーブルを調べると、値が正しく更新されます。

しかし、アプリの別の部分でこのメソッドを使用して更新された同じアイテムをロードすると、Inventory_Nb_In_Stockフィールドには更新前の値が表示されます。したがって、5Blue Pensがあり、4 の注文を渡すと、データ テーブルには 9 があることが示されますがBlue Pens、アプリで何Blue Pensを持っているかを確認すると、 5と表示されます。誰でも検証を確認できますか?同時に更新する値が多すぎますか? 私は何を間違っていますか?

編集

いくつかのテストを行ったところ、アプリを再構築した後にのみ値が更新されるようです。

4

1 に答える 1