2010-12-13 20 views
2

Entity Framework 4を使用していて、遅延読み込みにいくつか問題があります。 私は3つのエンティティを持ち、それぞれが互いに関係しています。 CarSetupには、エンティティを含むCarエンティティが含まれます。彼らはすべて怠け者です。Entity Frameworkと遅延ロードの問題

問題を再現するための簡単な単体テストを作成しました。

CarSetup carSetup = carSetupContext.CreateObject<CarSetup>(); 
Car car = Load("car1"); 
carSetup.Car = car; 

carsetupオブジェクトに車を割り当てるとクラッシュします。実際には、CarエンティティのEqualsメソッドでクラッシュします。

public override bool Equals(object obj) 
{ 
    if(obj == null) 
    { 
     return false; 
    } 

    return this.Event.Equals(((Car)obj).Event); 
} 

equalsメソッドが呼び出される前にエンティティをクイックウォッチすると、すべてのサブエンティティがロードされ、問題は発生しません。

車のセットアップに既存の車を割り当てると、フレームワークはその車の既存のCarSetupsをすべて読み込み、それらに「Equals」メソッドを呼び出します。ただし、遅延読み込みが有効になっているため、Carのイベントは通常のnullです。 Eventプロパティにアクセスしようとすると、NOの読み込みが発生し、クラッシュします。私はequalsメソッドで "this"プロパティをチェックしており、 "System.Data.Entity.DynamicProxies.Car"タイプです。私もチェックして、EventId Guidは車のエンティティに正しく設定されています。

誰でも何が起こっているかについて考えていますか?

EDIT:

car.Equals(car); 

すべてが完璧に動作します:私は私のてmanualy equalsメソッドを呼び出す場合は、もう少しテストを行った後。 Entity Frameworkがリレーションシップをロードすることを決定し、Equalsメソッドを自動的に呼び出すときにのみ発生します。

おかげ

+0

あなたと間違って何かがあります返り値は、Equalsメソッドのブラケットです。これはコンパイルされていないし、あなたの問題の理由になることもできないので、おそらくタイプミスだけです。 – Slauma

+0

それを指摘してくれてありがとう。私のエンティティはもう少し複雑なので、私は本当に間違いに気づいていない質問のためにそれをストライプしました。 – autoexec

答えて

0

Eventがロードされていないようです。メモリから私はイベントが車にロードされていることを確認するために、このような何かをやっているだろう:

context.Cars.Include("Events"); 

あなたは、私が慣れていないんだけど、Includeオペレータに見て構文を使用しています。

+0

構文については、ロード部分は単なる例でした。選択クエリに「インクルード」を追加すると、イベント全体が最初のクエリで読み込まれるため、遅延読み込みの目的を無効にすることはありませんか?ロード後にそのプロパティにアクセスしようとすると、私の遅延読み込みがイベントのために機能します。それは、それがうまくいかないような、 "奇妙な"シナリオでしかない。 – autoexec

0

あなたのオブジェクトコンテキストでは、有効なDynamicProxiesでPOCOオブジェクトを使用しているようですね。あなたのPOCOクラスにキャストしたobjCarにキャストし、System.Data.Entity.DynamicProxies.Carにキャストしないと、Carから動的に派生する可能性があります。このキャストを使用すると、obj(おそらくタイプSystem.Data.Entity.DynamicProxies.Carでもthisのようなものです)の機能を遅延的にロードすることができます。 (それはPOCOエンティティの遅延ロードを可能にするDynamicProxyだから。)

さて問題は、このタイプはコンパイル時には存在しないとのみ、実行時に動的に生成されるので、あなたの代わりにCarSystem.Data.Entity.DynamicProxies.Carにキャストすることができないということです。

ただし、C#4.0(Visual Studio 2010)を使用している場合は、新しいdynamicキーワードを使用して動的な型指定を使用できます。あなたのEqualsのオーバーライドは、次のようになります。

public override bool Equals(object obj) 
{ 
    if(obj == null) 
    { 
     return false; 
    } 

    dynamic o = obj; 

    return this.Event.Equals(o.Event); 
} 

(これはすべての暗いへのショットで、私は何をテストしていない。しかし、それは試してみる価値があるかもしれません。。)

+0

あなたの答えをありがとう。ショットに値するものでしたが、私は同じ問題を抱えています。実際には、問題はこれよりも大きく、関数に渡される "this"カーオブジェクトとobjカーオブジェクトの両方がDynamicProxiesであり、両方ともEventプロパティがnullであるためです。もう少しテストをした後、最初の投稿にコメントを追加しました。このシナリオは、フレームワークがMy Equalsメソッドを呼び出すときにのみ発生します。手動で呼び出すとうまく動作します。 – autoexec

+0

はい、私は、 'obj'がDynamicProxyであることを期待していました。しかし、EFがEqualsメソッドを呼び出すときにこれらのプロキシがナビゲーションプロパティをロードしないようです。私はもう考えていません。 EFのMS Dev-Center:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/threadsに質問してください。おそらくこのスレッドへのリンクがあります。 – Slauma

関連する問題