1

熱心な/怠惰な読み込みについて多くの質問がありますが、それでも私には明確でない点が 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)")。これが正しい理解である場合、どうすれば製品をカテゴリに添付しないようにできますか? 私が欲しいのは製品とそのカテゴリであり、製品のリストを含むカテゴリではありません。

4

1 に答える 1

1

私の知る限り、それを防ぐことはできません (いわゆる「関係修正」)。しかし、なぜそれを防ぎたいのですか?

あなたの理解は正しいです:

「...すでにロードされている製品をカテゴリに自動的に添付します...」.

ここで、「既に読み込まれている」には、同じコンテキストを持つ以前の (追跡された) クエリの結果と現在のクエリの結果が含まれます。

実行されるクエリに影響はありません。クエリは指定したことを実行します: カテゴリを含む製品をロードします (DB 内の単一の JOIN)。クエリには、これらのカテゴリをすべての関連製品にリンクする追加の JOIN がありません。リレーションシップの修正は、オブジェクトがアタッチされているメモリ内でのみ発生するため、不要なクエリ オーバーヘッドは発生しません。この動作は、熱心な読み込みと遅延読み込みで同じです。

于 2013-06-19T16:46:46.360 に答える