熱心な/怠惰な読み込みについて多くの質問がありますが、それでも私には明確でない点が 1 つあります。私は違いをよく知っており、「仮想」キーワードと遅延読み込みを防ぐ方法を理解しています。
非常に単純なモデルがあります: Store、Product、ProductCategory です。ストアには多くの製品とカテゴリを含めることができます。製品はストアに属し、カテゴリを持っている必要があります。簡単にするために、ProductCategory で "Products" プロパティを宣言したので、1 つのカテゴリに属するすべての製品をオンデマンドで取得できます。ここに私のクラスがあります:
public class Store
{
public Store()
{
this.Product = new HashSet<Product>();
this.ProductCategory = new HashSet<ProductCategory>();
}
[Key]
public int Id { get; set; }
[Required()]
public string Name { get; set; }
public ICollection<Product> Product { get; set; }
public ICollection<ProductCategory> ProductCategory { get; set; }
}
public class Product
{
[Key]
public int Id { get; set; }
public int StoreId { get; set; }
[Required()]
public Store Store { get; set; }
[Required()]
[MaxLength(50)]
public string Name { get; set; }
public int ProductCategoryId { get; set; }
[Required()]
public ProductCategory ProductCategory { get; set; }
}
public class ProductCategory
{
public ProductCategory()
{
this.Product = new HashSet<Product>();
}
[Key]
public int Id { get; set; }
public int StoreId { get; set; }
[Required()]
public Store Store { get; set; }
public string Name { get; set; }
public ICollection<Product> Product { get; set; }
}
私のコンテキストでは、Configuration.LazyLoadingEnabled = false に設定しました。明確でないのは、次のクエリの結果です。
var product = context.Products.Include(p => p.ProductCategory).Single(p => p.Id == 1);
その結果、1 つの製品 (予期される)、1 つのカテゴリが製品に関連付けられる (予期される) だけでなく、1 つの製品がカテゴリに関連付けられる (予期されない) ことになります。EF 5がどのように機能するかを理解している限り、最初に製品をロードしてからカテゴリをロードし、EFにこれを行うように指示していなくても、すでにロードされている製品をカテゴリエンティティに「自動的に」アタッチします(「インクルードなし」 (pc => pc.Product)")。これが正しい理解である場合、どうすれば製品をカテゴリに添付しないようにできますか? 私が欲しいのは製品とそのカテゴリであり、製品のリストを含むカテゴリではありません。