2016-08-24 14 views
0

EFコア(NPGSQLを使用)を使い始めたばかりで、ナビゲーションプロパティの読み込み方法が「インクルード」を明示的に使わずに読み込まれていることに気づきました。私が見ている例:Entity Framework重大な負荷をかけるコアナビゲーションのプロパティ

ObjectAに

ObjectA->リストをObjectB | ObjectA->リストObjectCに

ObjectB->リストObjectD

ナビゲーションプロパティのすべてが設定され、データベース内の各タイプの項目があります。

私はObjectAのクエリを任意のインクルードなしで実行するので、navプロパティは空でなければなりません。そうではありません。クエリーに応じて、明示的なインクルードなしでそれらのうちの1つが入力されることがあります(両方ともではなく、ObjectBまたはObjectCのみ)。明示的なインクルードを行うと、両方とも期待通りに表示されます。これは迷惑ですが、私が見ている本当に悪い問題ではありません。

私はObjectCに問い合わせます。すべてのnavプロパティが設定されている場合、ObjectAは期待どおりにロードされますが、ObjectAにはそのすべてのnavプロパティもロードされます。 ObjectCに関連するものだけでなく、 ObjectAのすべての子(およびその子)も同様に戻ってきます。これにより、要求されたものとはまったく関係のない何百ものアイテムが戻ってきます。

これはコードファーストです(私はNPGSQLの足場は非常にバグがあるので、私は手でDBを作成しています)。ここでは、親の関係は、私のエンティティの1のためにモデル化する方法の例です:私は、単一のアドレスを照会した場合

entity 
    .HasOne<User>(c => c.User) 
    .WithMany(p => p.Addresses) 
    .HasForeignKey(c => c.UserId) 
    .OnDelete(DeleteBehavior.Restrict) 
    .HasConstraintName<User, Address>("fk_addresses_user"); 

、親ユーザーが引き戻さますが、その下のすべての単一の他のアドレスも同様に、ユーザーに関連付けられています(これは単一のレベルの関連付けですが、Addressに子があれば、それらもすべて元に戻されます)。

私は今失っています。私ができることは、モデルからすべての子ナビゲーションプロパティを削除することだけです。

+0

ナビゲーションプロパティは 'virtual'として定義されていますか? –

+0

IIRC、Entity Frameworkに遅延読み込みを強制するオプションがあります(または熱心な読み込みを無効にする) –

+0

実際のコードを投稿して、何をしているのか確認できますか?あなたのモデルも投稿してください。また、あなたが持っている足場のバグの問題を公開してもいいですか?私は今非常に深刻なものは何も知らない。 –

答えて

0

私は今、何をしているのか分かっています。それはすでにローカルにトラッキングされている他のプロパティを含む自動です(これは理にかなっています)。私のテスト私は一度にいくつかのアイテムを読み書きしていましたが、明示的なインクルードなしで記入されているものが混乱していました。より多くのテストを行った後、同じコンテキストで他のエンティティにアクセスしない単純なクエリがあるときに期待通りに動作します

関連する問題