0

私は非常に混乱しています。プロキシ オブジェクトの全体的なポイントは、遅延読み込みとより優れた変更追跡を使用してパフォーマンスを向上させることのようです。しかし、Linq から EF クエリへのプロキシされた結果を取得し、その結果を HTTP 経由で JSON として返したい場合、型の不一致があるため、シリアル化によりエラーが発生するようです。

すべてのソリューションは、プロキシをオフにするように言っています。それらを使用できない場合、それらを持っている意味は何ですか?プロキシされていない新しい匿名型または POCO 型 (オブジェクト割り当て) をインスタンス化せずに、返す各オブジェクトをミラーリングすることなく、シリアル化されたプロキシ オブジェクトを返すにはどうすればよいですか?

4

1 に答える 1

0

遅延読み込み/プロキシを使用することによるパフォーマンスの向上は、一度にすべてのデータを取得しないことです。これにより、データベースへのラウンド トリップが速くなり、他のデータベース操作が遅くなったりブロックされたりする可能性が減少します。とにかくすべてのデータをロードすることがわかっている場合、必ずしもパフォーマンスが向上するとは限りません。

そうは言っても、Include(...) を使用できない場合 (GroupBy などの制限により)、いくつかのオプションがあります。

DB への複数回のトリップでデータをロードするには、参照またはコレクション プロパティで Load メソッドを使用して、データにアクセスせずにデータを明示的にロードします。その後、プロキシ生成を無効にできます。( http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx )

例えば:

context.Entry( entityObj ).Reference( "PropertyName" ).Load();
context.Entry( entityObj ).Collection( "PropertyName" ).Load();

一部のプロパティに対してプロキシを使用した遅延読み込みを利用したいが、コンテキストが破棄された後に WCF データ コントラクトのシリアル化が他のプロパティを遅延読み込みしようとするのを回避したい場合は、DB コンテキストのスコープを離れる前にエンティティをデタッチできます。

EntityA a = null;
EntityA a2 = null;

using (var db = new TestEntities())
{
    a = db.EntityAs.Where( ea => ea.Id == 1 ).Single();
    db.Entry(a).State = System.Data.EntityState.Detached;

    a2 = db.EntityAs.Where( ea => ea.Id == 2 ).Single();
}

var b1 = a.EntityB; // c will remain null; no exception thown
var b2 = a2.EntityB; // blows up b/c it attempts to lazy load
于 2013-03-26T22:21:08.987 に答える