0

Entity Framework 1.0 を使用して、2 フェーズ コミットの形式を実現しようとしています。

私が高いレベルで達成したいことは次のとおりです。

  1. データベースからすべてのデータを取得し、これをキャッシュに保存します。
  2. 個々のエンティティを変更する
  3. すべての変更をデータベースにコミットする

私がこれまでに遭遇した問題は、 IQueryable をキャッシュすることは、関係なくデータベースに戻るため、少し無意味だということです。したがって、もう 1 つのオプションは、クエリの結果を格納するために IEnumberable を使用することですが、これにより、1 つのクエリを継承して別のクエリに絞り込むことができなくなります (ただし、それは問題ありません)。もう 1 つの問題は、EntityContext の有効期限が切れるとすぐに (現在の httprequest で保持することができました)、変更を追跡できないことです。

過去にこれに似たようなことをやろうとした人はいますか、何か指針を得ましたか?

どうもありがとう、マット

jumpingmattflash.co.uk

4

2 に答える 2

1

IQueryable は、実際のデータではなく、クエリ可能なオブジェクトです。

ToList を実行してデータを取得する必要があります。

コンテキストを開いたままにしてトランザクションスコープを使用できる場合は、やろうとしていることを実行できます。ただし、ほとんどの場合、これは不可能です。これにより、データベースがロックされ、他の問題が発生します。

それを行うより良い方法は次のとおりです。

  • データベースからデータを読み取る
  • コンテキストを破棄する
  • クライアントが必要な変更を行う
  • 新しいコンテキストを開く
  • データを再度読み取ります。
  • 変更されたデータから 2 番目のセットにデータをコピーして変更を加える
  • 変更をコミットする
  • コンテキストを破棄する
于 2009-08-05T17:44:50.383 に答える
0

データベースから結果を呼び出し.ToList()ます。IQueryable次に、他のクエリへの絞り込みを開始するには、 を使用します.AsQueryable()。これで最初の問題が解決するはずです。

2 番目の問題については、解決策も探しています。私が理解しているように、Entity Framework のリレーションシップ パーツの基になる実装は、アセンブリObjectStateManagerSystem.Data.Objects名前空間を中心に展開しています。System.Data.EntityこれはMetadataWorkspace、名前空間のクラスを使用しSystem.Data.Metadata.Edmて関係マッピングを検索します。これらは、基礎となるデータベース接続なしで使用できる可能性があり、そうであれば、複雑なオブジェクト グラフを更新するための非常にグルーヴィーなツールを提供します。

個々のエンティティと同様の方法で、コンテキストに Detach と Attach があると便利です。Entity Framework の次のバージョンでは、これらの特定の種類の問題に焦点を当てるようです。エンティティとコンテキストを扱う際の自由度が向上します。

于 2009-07-24T03:23:12.620 に答える