EF5一对一列表并未实现每个实体

时间:2013-01-22 20:37:56

标签: entity-framework linq-to-entities entity-framework-5

我正在使用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无法在同一个图中实现同一对象的两个实例?

任何人都知道我的代码该做什么或出了什么问题?

非常感谢

1 个答案:

答案 0 :(得分:0)

这是因为您对模型的理解不正确。如果多个PricedProduct可以具有相同的Price或相同的Product,则您无法将其映射为一对一关系,而是将其映射为一对多(一个价格可以分配给多个定价产品) - 同样的产品)。你需要:

ToTable("PricedProducts", "Catalog");
HasRequired(t => t.Product).WithMany();
HasRequired(t => t.Price).WithMany();