2016-08-22 12 views
2

DBContextのFindメソッドに、ナビゲーションプロパティ/エンティティを熱心にロードする必要があることをどのように伝えますか?DBContextでeager loadingを指定する方法

Person primary = db.People.Find(Id); 
if (primary == null) 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 

// This line is required to load the related entity 
db.Entry(primary).Reference("Secondary").Load(); 

primary.Secondary = null; 
db.SaveChanges(); 

私はそれが働いて得るために行db.Entry(primary).Reference("Secondary").Load();を追加する必要がありました:

は私が関連セカンダリエンティティへの関連付けを削除し、次のコードを持っています。これは、エンティティフレームワークが遅延読み込みを使用しているためです。 Findメソッドでこれをオーバーライドして、FindメソッドのEagerバージョンを使用して余分な行を取り除くことはできますか?

答えて

-1

がちょうど

Person primary = db.People.Find(Id).FirstOrDefault(); 
0

Person primary = db.People.Find(Id); 

を変更するか、使用することができます

var result = db.Person.Include(c=>c.Secondary).FirstOrDefault(entity=>entity.Id == Id); 

含めるにおけるLINQの機能のために使用using System.Data.Entity;、そうでないあなただけの文字列を使用することができます」セカンダリ "のように:.Include("Secondary")

6

イーガーローディングをInclude方法によって行われる:

db.People.Include(p => p.Secondary) 

例えば、FirstOrDefault(p => p.Id == id)続くことができます。

Findは、コンテキストのキャッシュ内で要求されたエンティティを最初に見つけようとする方法です(DbSet)。そこに見つからない場合にのみ、エンティティはデータベースからフェッチされます。

この特別な動作(Find)のため、IncludeFindは混在できません。ルートエンティティがキャッシュ内に見つかったときに何をすべきかを定義するのは難しいでしょうが、含まれるエンティティは(または部分的に)存在しません。それらはデータベースからフェッチされるべきですか?これは、Find + Includeになることを意味します。は、完全なローカルキャッシュに依存することができないため、含まれているエンティティのデータベースにクエリする必要があります。それはFindの目的を破るだろう。または、ルートエンティティがローカルキャッシュにある場合は、ローカルキャッシュからのエンティティのみを検索する必要がありますか?それはメソッドの結果をあいまいにします。

ほとんどの場合、新しいコンテキストが作成され、エンティティがデータベースから一度取得されるため、ASP.Net MVC(またはWeb API)アクションメソッドでは、Findはほとんど役に立ちません。つまり、返されるキャッシュには何もありません。この方法を簡潔に使用することもできますが、データベースのラウンドトリップに関する効果はFirstOrDefault()と同じです。

関連する問題