おそらく、元の質問は長すぎて不要な詳細が多すぎると思うので、これは単純化するための私の試みです。
以下のアクションのいずれかを実行する手段を探しています。すべてではなく、1つだけ実行する必要があります。これらのいずれかに対する答えを誰かが知っている場合は、応答してください。したがって、LinqtoSQLで次のいずれかを実行することは可能ですか。
それらのエンティティを追跡するかどうかにかかわらず、エンティティを
DataContext
ビアから引き出しますか?ExecuteQuery
ExecuteMethodCall
それらのエンティティがすでに取得されており、IDキャッシュにすでに存在している場合でも、データベースから取得した結果の新しいコピーを常に呼び出す
ExecuteQuery
か、保証しますか?ExecuteMethodCall
特定のエンティティタイプで変更追跡を実行しないようにLinqtoSQLに指示しますが、他のタイプの変更追跡は許可しますか?
制限:
この
Refresh
方法は問題外です。エンティティの数は非常に多く、これはパフォーマンスの障害になります。クエリの実行後にに戻すことはできないため、単純にに設定することはできません。また、
ObjectTrackingEnabled
一部のエンティティを追跡する必要があります。false
DataContext
true
また、オリジナルを捨てて
DataContext
新しいものを使用することもできません。トランザクションの途中でこれを実行できる必要があります。
これは深刻な問題になり始めており、デフォルトの動作はよく考えられていないと思います。アドホッククエリまたはストアドプロシージャを実行すると、受け取る結果は、そのクエリによって返された正確な結果になると思います。それは理にかなっているだけです。古い、古いエンティティが必要な場合、なぜデータベースに戻ってそれらを取得するのでしょうか。
現時点での回避策は、(a)DataContext
クエリ用に特別に新しいものを作成し、トランザクション分離レベルをオーバーライドするか、(b)リターンタイプをすべての点でエンティティと同一であるが、[Table]
属性を作成し、AutoMapperを使用して元のエンティティにマップします。これらは両方とも恐ろしいハックのようです。
この難問について誰かが持っている提案を本当に感謝します。