我正在使用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的关系
我使用此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();
只要两个PricedProduct不共享相同的产品或相同的价格,一切正常。
意思是,在PricedProducts表中,只要产品或价格FK是“唯一的”,就可以正确检索和实现PriceProduct,如果另一个PricedProduct在价格上具有相同的FK值,价格将不会被加载到关注PricedProduct。
我已经快速检查生成的SQL查询,看起来很好,感觉EF无法在同一个图中实现同一对象的两个实例?
任何人都知道我的代码该做什么或出了什么问题?
非常感谢
答案 0 :(得分:0)
这是因为您对模型的理解不正确。如果多个PricedProduct
可以具有相同的Price
或相同的Product
,则您无法将其映射为一对一关系,而是将其映射为一对多(一个价格可以分配给多个定价产品) - 同样的产品)。你需要:
ToTable("PricedProducts", "Catalog");
HasRequired(t => t.Product).WithMany();
HasRequired(t => t.Price).WithMany();