0

EF エンティティ モデルのエンティティセット インスタンス間の関係を理解し​​ようとしています (モデルはエンティティ デザイナーによって作成されました)。基本的に、エンティティの Repository クラスの 2 つのインスタンスを持つ 1 つの論理トランザクションになります。1 つのインスタンスで正常にコミットされた (SQLServer への直接 SSMS クエリによって確認された) データは、他のインスタンスには表示されません。おおまかな流れはこうです。

ARepository _aR = new ARepository();

A a = _aR.Find(id);   //Find does something like:  return db.ASet.Where(x => x.id == id);

b.BeginAcctBal = a.AcctBal;  

brepo.AddTxn(params ... n);  //Creates and saves n txns, and creates its own ARepository instance that updates its instance of AcctBal, which I can see happening in the DB)

A a = _aR.Find(id);  //The hope is this gets the updated AcctBal after committed by AddTxn, but it doesn't).

b.EndAcctBal = a.AcctBal;  // Still contains the starting balance value.

AddTxn の直後に配置ARepository _aR = new ARepository();すると、後続のコードは AddTxn 後の AcctBal 値を実際に取得します。

質問:

db.ASet.Where(x => x.id == id);データベースからリロードしないのはなぜですか? _aR インスタンスが作成されたときから、本当に常にスナップショットから読み取っていますか?

_aR がスナップショットの場合、それをリロードする方法はありますか?

_aR がスナップショットの場合、トランザクションの整合性はどのように維持されますか? より具体的には、それを維持するために何かをする必要がありますか?それとも EF と MVC 1.0 の組み合わせは、このトランザクションの魔法を私のために行いますか?

4

1 に答える 1

1

ObjectContext (_aR) にクエリを実行すると、デフォルトで、同じ EntityKey を持つ DB から既に取得されているインスタンスがないかどうかがチェックされます。見つかった場合は、DB に再度戻るのではなく、作成済みのインスタンスを返します。

この動作は、ObjectQuery のMergeOptionプロパティによって決定され、デフォルトは MergeOption.AppendOnly です。代わりに、毎回 DB から値を取得するMergeOption.OverwriteChangesまたはMergeOption.NoTrackingを使用することをお勧めします。

参考になる参考資料を次に示します。

  1. MergeOptions の説明
  2. オブジェクト コンテキストの Refresh メソッド
  3. 変更の保存と同時実行の管理 (Entity Framework)
  4. 同様のフォーラム投稿
于 2009-12-31T00:53:54.127 に答える