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;}
}

它们使用 fluent 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 表中,只要 Product 或 Price FK 是“唯一的”,PriceProduct 就会被正确检索和具体化,例如,如果另一个 PricedProduct 在 price 上具有相同的 FK 值,则不会将 price 加载到相关的 PricedProduct 中。

我快速检查了生成的 SQL 查询,它看起来很好,感觉就像 EF 无法在同一个图中实现同一个对象的两个实例??

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

非常感谢

4

1 回答 1

0

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

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