次のエンティティ モデルと関数を検討してください。
public class Order
{
public int OrderId {get; set;}
public int StatusId {get; set;}
public virtual Status OrderStatus {get; set;}
}
public class Status
{
public int StatusId {get; set;}
public String Name { get; set;}
}
public void ShowOrders()
{
//load all status entities.
//Will EF check for these in object cache first when I access order.Status for
//the first time?
//Or perhaps even auto include them in materialised orders?
context.Status.Load();
//enumerate orders without explicit status include
foreach(Order o in context.Orders.ToList())
{
//Get Status navigation property for each order
//Will database be hit?
Console.WriteLine("Order: {0:N}, Status: {1}", o.OrderId, o.OrderStatus.Name);
}
}
私は明示的にできることを知っています:
context.Orders.Include(o=>o.OrderStatus).ToList();
n+1 の選択を防ぐために、注文のクエリ時に Status を含めます。また、チェックされOrder.OrderStatus
ているナビゲーション プロパティにアクセスし、可能であればデータベースにヒットする前に取得されたキャッシュされた Status オブジェクトを取得することを知っています。DbReferenceEntry.IsLoaded
私が疑問に思っているのは、参照エンティティが既にオブジェクトキャッシュにある場合、親エンティティが具体化されたときに (呼び出されていなくても) データが取り込まれているかどうかDbReferenceEntry.IsLoaded
ですDbReferenceEntry.CurrentValue
。.Include()
上記の例では、注文を列挙する前の呼び出しにより、すべての Status がオブジェクト キャッシュにあるにもかかわらずOrder.OrderStatus
、初めてアクセスしたときにデータベース クエリが実行されるのでしょうか?Status.Load()