2012-04-11 10 views
9

コンテキストの直後にコンテキストが配置されるため、関連するすべてのエンティティ(両方とも - > 1 FKs - > N FKs)を読み込む必要のある特定のクエリがあります。 。EF Code First:オプションの関係に含まれないインクルード

私はparams Expression<Func<MyItem, object>>[] includesを受け取り、それを内部的にチェーンする一般的な "クエリ"メソッドを作成しました。その部分は正常に動作します。

クエリは次のようになります。

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

(SubChildNotWorkingの構成で配置)動作していないプロパティのマッピング:含まれるすべての

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

、唯一SubChildNotWorking doesnの」実際に働く。返されたオブジェクトをデバッガで調べると、すべてのプロパティのプロキシが表示されます。プロキシを開くと、他のすべてのリレーションの正しいデータが得られます。SubChildNotWorkingプロパティの場合、「objectcontextはすでに例外として処理されています。

唯一の違いは、SubChildNotWorkingは、NULL可能なFK(dbcontextではDBおよびWithOptional構成でNULL可能な列)ですが、他のすべてはWithRequiredで構成されたNULL可能ではないFKです。

データベースは、コードファーストで作成されておらず、規約に従わないレガシーDBでもあり、DbContextでマッピングを作成したばかりです。それ以外はうまく動作します。

ヌル可能なFKで熱心な読み込みが機能しないのかどうかを確認しようとしていますが、それに関するドキュメントが見つかりませんでした。

これはバグか意図した動作ですか?しかし、何よりも、私はこれをどのように解決するのですか?

ありがとうございました。

+0

あなたが他のsubchildrenなしのみ 'SubChildNotWorking'が含まれている場合はどうなりますか?それはその後動作しますか? – Slauma

+0

どちらもうまくいきません。 –

+1

SQLが正しいかどうかチェックすることができますか( 'var sql = facade.Query (c => c.Childs.Select(x => x.SubChildNotWorking))。ToString();')、予想される結果の行を返す場合はSSMS。 – Slauma

答えて

0

あなたのクラス(エンティティ)の

[DataContract] 

を定義しましたか?もしそうなら、

[DataMember] 

であなたのSubChildに注釈を付けることを忘れていないか、またはそれがロードされていますが、エンティティ上のあなたのGETの呼び出しを実行するときに表示されない終わるかもしれません。

0

あなたがincludeメソッドを使って作業しているとき、熱心な負荷パターンについて話しています。リレーションシップを持つエンティティはコレクションとしてロードされます。 null以外の外部キーの場合は、空になってからは簡単なコレクションがありますが、nullの場合はありません。コード上では、ナビゲーションプロパティを仮想にすることができますが、それはあなたの場合ではありません。あなたは、たとえば、コンテキストに直接それをロードしようとすることができます

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

または短いバージョン:

context.EntitiesWithFKNullable.Load(); 
関連する問題