.net EF核心关系走向错误

.net EF核心关系走向错误,.net,entity-framework-core,one-to-many,.net,Entity Framework Core,One To Many,我有过敏的产品。然而,当我尝试在EF core中对此进行建模时,我无法使一对多关系发挥作用。EF在Allergies中创建了一个新字段ProductId,因此只有一种产品可以有一种过敏 这是我的代码: public class Product { [Key] public int ProductId { get; set; } public string Name{ get; set; } public byte[]

我有过敏的产品。然而,当我尝试在EF core中对此进行建模时,我无法使一对多关系发挥作用。EF在Allergies中创建了一个新字段ProductId,因此只有一种产品可以有一种过敏

这是我的代码:

   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; }
    }
公共类产品
{
[关键]
public int ProductId{get;set;}
公共字符串名称{get;set;}
公共字节[]图像数据{get;set;}
公共虚拟ICollection过敏{get;set;}
}
公共课过敏
{
[关键]
public int AllergyId{get;set;}
公共字符串名称{get;set;}
}
这似乎导致了一对一的关系(过敏最终也会有productId)。我怎样才能解决这个问题

谢谢

这似乎导致了一对一的关系(过敏最终也会有productId)。我怎样才能解决这个问题

没有什么需要修复的,因为这是关系数据库一对多关系的正确实现

关系总是有两面性的,多样性{from}-{to}取决于你从关系的哪一面看。因此,从
产品
方面看,它是一对多,但从
过敏
方面看,它是多对一。i、 e.每个
过敏
都有一个产品,在数据库中用
过敏
中的FK列表示,引用
产品
中的PK

请记住,数据库表是平面的,因此给定
产品的集合导航属性
Product.Allergies
表示如下查询

db.Allergies.Where(allergy => allergy.ProductId == product.Id)
db.Products.Single(product => product.Id == allergy.ProductId)
由于
Allergy
表中的
ProductId
不是唯一的,因此每种产品都会产生很多过敏反应。但是,
Product
表中引用的列
Id
是唯一的,因此反向引用导航属性
Allergy.Product
将表示如下给定的
Allergy
查询

db.Allergies.Where(allergy => allergy.ProductId == product.Id)
db.Products.Single(product => product.Id == allergy.ProductId)
参考:在EF核心文档中


话虽如此,如果你不想FK出现在《变态反应》
中,你很可能在寻找一段感情。这种类型的关系需要额外的“链接”(“join”)表,在当前的EF Core版本(3.1)中,它需要明确的实体类,如文档链接中所述:

不支持没有实体类来表示联接表的多对多关系。但是,您可以通过包含联接表的实体类并映射两个单独的一对多关系来表示多对多关系

接下来的一个例子将简化这种关系的创建,但在此之前,您必须使用前面提到的方法

这似乎导致了一对一的关系(过敏最终也会有productId)。我怎样才能解决这个问题

没有什么需要修复的,因为这是关系数据库一对多关系的正确实现

关系总是有两面性的,多样性{from}-{to}取决于你从关系的哪一面看。因此,从
产品
方面看,它是一对多,但从
过敏
方面看,它是多对一。i、 e.每个
过敏
都有一个产品,在数据库中用
过敏
中的FK列表示,引用
产品
中的PK

请记住,数据库表是平面的,因此给定
产品的集合导航属性
Product.Allergies
表示如下查询

db.Allergies.Where(allergy => allergy.ProductId == product.Id)
db.Products.Single(product => product.Id == allergy.ProductId)
由于
Allergy
表中的
ProductId
不是唯一的,因此每种产品都会产生很多过敏反应。但是,
Product
表中引用的列
Id
是唯一的,因此反向引用导航属性
Allergy.Product
将表示如下给定的
Allergy
查询

db.Allergies.Where(allergy => allergy.ProductId == product.Id)
db.Products.Single(product => product.Id == allergy.ProductId)
参考:在EF核心文档中


话虽如此,如果你不想FK出现在《变态反应》
中,你很可能在寻找一段感情。这种类型的关系需要额外的“链接”(“join”)表,在当前的EF Core版本(3.1)中,它需要明确的实体类,如文档链接中所述:

不支持没有实体类来表示联接表的多对多关系。但是,您可以通过包含联接表的实体类并映射两个单独的一对多关系来表示多对多关系

接下来的一个例子将简化这种关系的创建,但在此之前,您必须使用前面提到的方法