EF核心关系方向错误

时间:2020-09-19 18:54:28

标签: .net entity-framework-core one-to-many

我有过敏产品。但是,当我尝试在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)。我该如何解决?

谢谢!

1 个答案:

答案 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,它将简化这种关系的创建,但是在此之前,您必须使用上述方法。