4

シナリオ: ナビゲーション プロパティを持つエンティティをデータベースに追加したいのですが、そのエンティティにはナビゲーション プロパティがあります。基本的に、データベース内のテーブルは相互に接続されています - それらすべてです。

私は EF4.3 とコンテキスト/リクエスト パターンを使用しているため、遅延読み込みを有効にしたくありません。必要なエンティティをロードするのに時間がかかりすぎるだけです。これまでのところ、次のような include メソッドを使用する以外に方法がないことを学びました。

 context.Set<TEntity>().include("navproperty1").include("navproperty1.navproperty1.1")... and so on.

この方法では保守性が悪く、コードが多くなりますが、すべてのエンティティ タイプのすべてのインクルードを手動で書きたくない場合、他に方法はありますか?

4

2 に答える 2

7

ここにはたくさんの質問があります。各ポイントに対処しようと思います。

まず、遅延読み込みが常に高速であるとは限りません。特に、すべてのリレーションをロードしている場合。

第二に、常に「魔法のひも」を避けてください。Includeラムダ式 (IQueryable 拡張機能) を受け取るメソッドが EF 4.3 で使用できるかどうかはわかりません。そうでない場合は、ここに示すように自分で実装し、次を使用する必要があります。

context.Set<TEntity>().include(t => t.NavProp)

"A" エンティティ" は "B" エンティティに対して 1 : n の関係を持っていますが、"B" エンティティは "C" エンティティに対して n : m の関係を持っています。 SaveChanges() の場合、「B」と「C」の間ですべてのデータが失われます

私はあなたが何を意味したのかよくわかりません。ただし、リスト内の項目に属するサブナビゲーション プロパティを選択する場合は、EF 5 でこれを使用する必要があります: (4.3 で機能するかどうかは不明)

context.Set<TEntity>().Include(t => t.Collection.Select(c => c.SubProp))

その他の表現はこちら

その引用を明確にしていただければ、もっとお手伝いできるかもしれません。

于 2013-06-25T21:49:43.133 に答える
0

このスニペットを見てください

var dbQuery =
context.Letters.Where(letter => letter.ID == myId)
   .Include(l => l.Recipients.Select(y => y.PersonTitle))//this will include letter.Recipients.PersonTitle
   .Include(l => l.PersonTitle)
   .Include(l => l.Rank)
   .Include(l => l.JobTitle);
theLetter = dbQuery.FirstOrDefault();// maybe null returned

この行

context.Letters.Include(l => l.Recipients.Select(y => y.PersonTitle))

その文字を取得し、受信者ナビゲーションプロパティ内に存在するものにRecipientsアクセスできますPersonTitle

それは、ナビゲーション プロパティ 内の ナビゲーション プロパティを意味します

于 2016-10-12T12:57:15.330 に答える