我有过敏产品。但是,当我尝试在EF核心中对此建模时,我无法获得一对多关系。 EF创建了一个新字段,即“过敏症中的ProductId”,因此只有一种产品可以具有1种过敏。
这是我的代码:
public class Product
{
[Key]
public int ProductId { get; set; }
public string Name{ get; set; }
public byte[] ImageData { get; set; }
public virtual ICollection<Allergie> Allergies { get; set; }
}
public class Allergy
{
[Key]
public int AllergyId { get; set; }
public string Name{ get; set; }
}
这似乎导致一对一关系(过敏最终也具有productId)。我该如何解决?
谢谢!
答案 0 :(得分:0)
这似乎导致一对一关系(过敏最终也具有productId)。我该如何解决?
没有什么要解决的,因为这是关系数据库一对多关系的正确实现。
关系总是有两个方面,并且多重性(从)到{到}取决于您正在寻找的关系的哪一侧。因此,从Product
方面来看,它是一对多的,但是从Allergy
方面来看,它是多对一个的。也就是说,每个Allergy
都精确地一个 Product
,在数据库中用Allergy
中的FK列表示,引用了Product
中的PK。 >
请记住,数据库表是平坦的,因此给定Product.Allergies
的集合导航属性product
表示这样的查询
db.Allergies.Where(allergy => allergy.ProductId == product.Id)
由于ProductId
表中的Allergy
不是唯一的,因此给每种产品带来很多过敏。但是Id
表中被引用的列Product
是唯一的,因此反向引用导航属性Allergy.Product
代表这样的给定allergy
查询
db.Products.Single(product => product.Id == allergy.ProductId)
参考:EF Core文档中的Relationships。
话虽如此,如果不想在Allergy
中加入FK,您可能正在寻找many-to-many关系。这种类型的关系需要附加的“链接”(“ join”)表,并且在当前的EF Core版本(3.1)中,它需要显式的实体类,如文档链接中所述:
尚不支持没有实体类来表示联接表的多对多关系。但是,可以通过为联接表包括一个实体类并映射两个单独的一对多关系来表示多对多关系。
即将到来的EF Core 5.0 will add support for many-to-many relationships without explicitly mapping the join table,它将简化这种关系的创建,但是在此之前,您必须使用上述方法。