1

LINQ to Entities の使用は、データベースに対してクエリを実行し、変更やデータ バインドなどを行うことができる実際の CLR オブジェクトを取得するための優れた方法のように思えます。しかし、同じクエリを 2 回実行すると、同じ CLR オブジェクトまたはまったく新しいセットへの参照が返されるのでしょうか?

複数のクエリによって、同じ実際のデータのコピーが増え続けることは望ましくありません。ここでの問題は、あるエンティティの内容を変更してデータベースに保存し直すことはできますが、エンティティの別のインスタンスがまだ別の場所に存在し、古いデータを保持していることです。

4

3 に答える 3

1

同じ DataContext でクエリを実行すると、同じオブジェクトが取得されます (DataContext はこのための内部キャッシュを維持します)。

扱うオブジェクトは変更可能である可能性が高いことに注意してください。そのため、1 つの問題 (データの重複) ではなく、別の問題 (同時アクセス) が発生する可能性があります。

ビジネス ケースによっては、古いデータを持つ 2 番目のトランザクションがコミット時に失敗しても問題ない場合があります。

また、古き良き IDataReader/DataSet シナリオを想像してみてください。2 つのクエリは、異なるデータセットを満たす 2 つの異なるリーダーを返します。したがって、データ重複の問題は ORM 固有のものではありません。

于 2008-11-11T08:13:22.067 に答える
1

同じ DataContext 内では、投影ではなく完全なオブジェクトを返すクエリの場合、常に同じオブジェクトを取得することが私の理解です。

ただし、異なる DataContext は異なるオブジェクトをフェッチします。そのため、古いデータがそこに表示されるリスクがあります。

于 2008-11-11T07:59:53.577 に答える
0

[おっとっと; この返信は、Entity Framework ではなく、Linq-to-SQL に適用されることに注意してください。]

部分的にトピックに沿っており、役立つ可能性があるため、(削除するのではなく) ここに残しました。


他の応答に加えて、データコンテキストには、単に「主キーによる」クエリのラウンドトリップを回避する機能もあることに注意してください-最初にキャッシュをチェックします。

残念ながら、3.5 では完全に壊れており、3.5SP1でもまだ半分壊れていますが、一部のクエリでは機能します。個々のオブジェクトを取得する場合、これにより多くの時間を節約できます。

したがって、基本的に、IIRC を使用する必要があります。

// uses object identity cache (IIRC)
var obj = ctx.Single(x=>x.Id == id);

だがしかし:

// causes round-trip (IIRC)
var obj = ctx.Where(x=>x.Id == id).Single();
于 2008-11-11T08:27:21.227 に答える