私は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 つのインスタンスを具体化できないように感じますか?
誰が何をすべきか、または私のコードの何が問題なのか知っていますか?
どうもありがとうございます