0

私はEF5.0 CFを使用しています。これらのエンティティを考えてみましょう(ここでは簡略化されています):

public class Catalog 
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }
    public ICollection<PricedProduct> Products { get; set; }    
}

public class PricedProduct 
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public Product Product { get; set; }
    public Price Price { get; set; }
}

public class Price 
{
    public int Id { get; set; }
}

public class Product 
{
    public int Id { get; set; }
    public string Name {get; set;}
}

これらは流暢な API で構成されています。

//For the Catalog entity
 ToTable("Catalog", "Catalog");
 this.Property(t => t.Name).HasColumnType("nvarchar").HasMaxLength(100).IsRequired();

 this.HasMany<PricedProduct>(t => t.Products).WithMany().
 Map(mc =>
        {
        mc.ToTable("CatalogPricedProduct", "Catalog");
        mc.MapLeftKey("PricedProductID");
        mc.MapRightKey("CatalogID");
        });

//For the PricedProduct entity
ToTable("PricedProducts", "Catalog");
HasRequired(t => t.Product).WithOptional().Map(m=>m.MapKey());
HasRequired(t => t.Price).WithOptional().Map(m => m.MapKey());

//For the Product entity
ToTable("Products", "Catalog");
this.Property(t => t.Name).HasColumnType("nvarchar").HasMaxLength(100).IsRequired();

//For the Price entity
ToTable("Prices", "Catalog");

したがって、基本的に、PricedProduct と n:n の関係を持つカタログがあり、Product と Price と 1:1 の関係が 2 つあります。

私はこのlinqクエリでそれらのエンティティを取得します:

var qy = from cata in this.Set<Catalog>().Include("Products")
                    .Include("Products.Product")
                    .Include("Products.Price")
                    where cata.Name == "name" 
                     select cata;
return qy.FirstOrDefault();

2 つの PricedProduct が同じ製品または同じ価格を共有しない限り、すべてがうまく機能します。

つまり、PricedProducts テーブルでは、Product または Price FK が「一意」である限り、PriceProduct が取得され、正しく具体化されます。たとえば、別の PricedProduct が同じ価格の FK 値を持っている場合、価格は関連する PricedProduct に読み込まれません。

生成された SQL クエリをすばやく確認したところ、問題ないように見えます。EF が同じグラフで同じオブジェクトの 2 つのインスタンスを具体化できないように感じますか?

誰が何をすべきか、または私のコードの何が問題なのか知っていますか?

どうもありがとうございます

4

1 に答える 1

0

それは、モデルの理解が正しくないためです。複数PricedProductが同じPriceまたは同じである可能性がある場合Product、それを 1 対 1 の関係としてマッピングすることはできませんが、1 対多としてマッピングします (1 つの価格を多くの価格設定された製品に割り当てることができます - 製品についても同様です)。必要なもの:

ToTable("PricedProducts", "Catalog");
HasRequired(t => t.Product).WithMany();
HasRequired(t => t.Price).WithMany();
于 2013-01-23T09:32:15.677 に答える