2016-09-21 9 views
3

私はエンティティフレームワークを勉強しています。Find()メソッド私は理解できません。
"Entity Frameworkのプログラミング:コードファースト" ジュリアラーマンの本から採取したサンプルEntity FrameworkのFindメソッドはどのように機能しますか?

public class Destination 
{ 
    public int DestinationId { get; set; } 
    public string Name { get; set; } 
    public string Country { get; set; } 
    public string Description { get; set; } 
    public byte?[] Photo { get; set; } 
    public ICollection<Lodging> Lodgings { get; set; } 

    public Destination() 
    { 
     Lodgings = new List<Lodging>(); 
    } 
} 

public class Lodging 
{ 
    public int LodgingId { get; set; } 
    public string Name { get; set; } 
    public string Owner { get; set; } 
    public bool IsResort { get; set; } 
    public Destination Destination { get; set; } 
} 

そして、私は次の方法でデータを操作する:

var destination = organizationDbContext.Destinations // case # 1 
       .Include("Lodgings") 
       .First(p=>p.DestinationId==1); 

var destination = organizationDbContext.Destinations.Find(1); // case # 2 
  1. なぜ私ができます」 Include()呼び出し後の最初のケースでFind()メソッドを呼び出しますが、Wh​​ere()およびFirst()を使用できますか?
  2. Find()で2番目のケースを使用する場合、ここではIncluding()メソッドをLodgingsに呼び出すことはできません。関連するロードをどのようにロードする必要がありますか?

    1. 行うための正しい方法は何ですか:1つのオブジェクトを見つけると(1対多)、関連するすべての内部オブジェクトをロードするには

    私の質問

  3. は別の方法で表現されるだろうか?
  4. すべてのオブジェクト(セットA)と内部の関連オブジェクト(A.Iを設定)をロードし、(A)からIDで1つを探します。
+1

をDbSet 'が行います。そういうわけで、#2の場合 – Fabjan

答えて

4

Findは、コンテキストのローカルキャッシュを検索することから始まります。一致するものが見つからなければ、dbにクエリを送信します。

DbSetのFindメソッドは、プライマリキーの値を使用して、コンテキストによって追跡されるエンティティ の検索を試みます。エンティティが コンテキスト内に見つからない場合、エンティティ を見つけるためにクエリがデータベースに送信されます。エンティティがコンテキスト内に見つからない場合、またはデータベースの が見つからない場合は、Nullが返されます。

IQueryableにはFindがないという内部的な説明だと思います。 次のコードEFを使用しているDBに常に要求を送信します。

var destination = organizationDbContext.Destinations // case # 1 
       .Include("Lodgings") 
       .First(p=>p.DestinationId==1); 

もっとに関する情報:私の知る限り、 `IEnumerableを `メソッドが含まれていません `Find`が、`を知っているように https://msdn.microsoft.com/en-us/data/jj573936.aspx

3

問題は、私たちはさまざまな種類を使用して、このタイプのいずれかが別のものはそうではない方法で検索が含まれていることです:

1.

var destination = organizationDbContext.Destinations // case # 1 
       .Include("Lodgings") // type here is IQueryable<T> no method Find defined 
       .First(p=>p.DestinationId==1); 

2.

         // type here is DbSet<T> with defined method Find 
var destination = organizationDbContext.Destinations.Find(1); 
関連する問題