我正在使用 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 无法在同一个图中实现同一个对象的两个实例??
任何人都知道我的代码该怎么做或有什么问题?
非常感谢