0

すべて、私はここで新しいです。私の問題は、1回のトランザクションでsavechangesを2回呼び出す方法です。以下は私のコードです:

var order = new Order();

// modify order's properties

db.orders.add(order);
db.SaveChanges();

db.Entry(order).reload();

// do some other work about the order entity
db.Entry(order).state = EntityState.Modified;
db.SaveChanges();

しかし、2番目のSaveChangesは失敗しました。エラーメッセージは、「予期しない行数(0)に影響します。エンティティはロード後に変更または削除される可能性があります。ObjectStateManagerを更新してください」です。

私の質問は、2番目のSaveChanges()を機能させる方法です。注文エンティティのプロパティコードは、データベースのカスタム関数に基づく自動増加カスタム文字列フィールドであるためです。

ありがとう

4

1 に答える 1

0

.Reload() への呼び出しは必要ありません。@maxlego が述べたように、AutoDetectChangesEnabled をデフォルトの true から変更していない場合は、.State を modified に設定する必要はありません。

このパターンに従って、目的の結果を得ることができるはずです。以下は、TransactionScope の有無にかかわらず実行できます。TransactionScope を使用する利点は、SaveChanges() への 2 回目の呼び出しが例外で失敗した場合、最初の呼び出しで行われた変更がロールバックされることです。一方、2 回目の呼び出しが失敗した場合でも、SaveChanges() の最初の呼び出しを成功させたい場合は、TransactionScope コードを削除する必要があります。

using (var db = new MyContext())
using (var scope = new TransactionScope())
{
    var order = new Order();

    // modify order's properties

    db.orders.add(order);
    db.SaveChanges();

    // make additional changes...
    // E.g. assuming order.ID is an auto-incrementing primary key
    // that is determined by the database I can now use the
    // value the database set to log this change...

    // save changes
    db.SaveChanges();

    // commit the transaction
    scope.Complete();
}
于 2013-03-11T14:23:16.230 に答える