0

次のコードを使用して Order オブジェクトを保存しています。

public void SaveOrder (string orderNo)
{
    using (var se = new StoreEntities)
    {
        var order = new Order { OrderNumber = orderNo }

        try
        {
            //// Update
            if (se.Orders.Any(e => e.OrderNumber == orderNo))
            {
                se.Orders.Attach(order);
                se.ObjectStateManager.ChangeObjectState(order, EntityState.Modified);
            }
            //// Create
            else
            {
                se.Orders.AddObject(order);
            }
            se.SaveChanges();
        }
        catch (OptimisticConcurrencyException){
            se.Refresh(RefreshMode.ClientWins, order);
            se.SaveChanges();
        }
    }
}

これは、新しい注文であり、DB に挿入するだけの場合にうまく機能します。ただし、既存の注文を更新しようとすると、次のエラーが表示されます。

次のオブジェクトはストアで見つからなかったため、更新されていません: 'EntitySet=Orders;OrderID=0'。

データベースでは、Order テーブルは次のようになります。

OrderID | OrderNumber
13        567-87
15        567-93

ここで、OrderID は ID キーです。削除されているため、これら 2 つの行以外に行はありません。

レコードを更新できないのは何が悪いのですか?

4

1 に答える 1

1

Order作成した新しいオブジェクトOrderを既に存在するかのようにアタッチしているため、エラーが発生しているようです。そのためOrderID、エラーの はゼロです。

これを試して:

try
{
    //// Update
    var existingOrder = se.Orders.FirstOrDefault(e => e.OrderNumber == orderNo);

    if (existingOrder != default(Order))
    {
        existingOrder.DateLastUpdated = DateTime.Now;
        se.ObjectStateManager.ChangeObjectState(existingOrder, EntityState.Modified);
    }
    //// Create
    else
    {
        se.Orders.AddObject(order);
    }
    se.SaveChanges();
}

編集

注文の詳細をプロパティごとに更新できます。または、更新したい詳細を含むOrder(または、おそらく) がある場合は、 AutoMapperなどを使用して値をコピーできます。OrderViewModel

于 2013-01-17T21:50:09.630 に答える