多对多+附加列EF设计,它是添加一个额外的列到我的表

本文关键字:一个 我的 添加 EF 设计 | 更新日期: 2023-09-27 18:17:05

我想要下面的表结构:

Person
-person_id
Company
-company_id
Company_Person
-person_id
-company_id
-other_column
Location
-id

目前,我的EF在Person表中产生'company_id'列,也作为FK。

我的模特看起来像:

public class Person 
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PersonId { get; set; }
        public int LocationId {get;set;}
        public virtual Location Location {get; set; }           
        public virtual ICollection<CompanyPerson> CompanyPersons {get; set;}
}

public class Company
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CompanyId { get; set; }
        public virtual ICollection<CompanyPerson> CompanyPersons {get; set;}
}

[Table("Company_Person")]
public class CompanyPerson
{
    [Key, Column(Order = 0)]
    public int PersonId { get; set; }
    [Key, Column(Order = 1)]
    public int CompanyId { get; set; }
    public bool IsActive { get; set; }
    public virtual Person Person { get; set; }
    public virtual Company Company { get; set; }
}

public class Location 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public int id {get;set;}
     public virtual ICollection<Person> Persons {get;set;}
 }

我遵循了与这里相同的模式:首先创建代码,多对多,在关联表

中添加附加字段

如何从Person表中生成额外的CompanyId列?

更新

好吧,我想明白了,原来这是另一个我没有发布的关联(又是我的错)。

在我的Company模型中,我注释掉了这个,它生成了正确的表。我仍然想要这个协会,所以有人能告诉我为什么会发生这种情况吗?

public class Company
{
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CompanyId { get; set; }
        public virtual ICollection<CompanyPerson> CompanyPersons {get; set;}
        public virtual ICollection<History> Histories {get; set; }
}

public class History
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    [ForeignKey("Company")]
    public int CompanyId { get; set; }
    public virtual Company Company { get; set; }
}

当我注释掉History模型中除了Id属性和Company之外的所有内容时。History属性生成了我想要的表结构

多对多+附加列EF设计,它是添加一个额外的列到我的表

认为 EF将您的CompanyPerson属性视为复杂类型,因为从本质上讲,它实际上无法与您给它的内容创建M2M关系。无论这实际上是问题与否,无论哪种方式,你都需要修复你的CompanyPerson属性为:

public virtual ICollection<CompanyPerson> CompanyPersons { get; set; }

最奇怪的部分是,你的History类将完美地解释这个问题,如果它实际上只被定义为:

public class History : Person

这就是为什么我问你Person的任何子类,因为EF对继承的默认行为是使用TPH(每个层次结构的表)。换句话说,它只是将所有子类的所有属性添加到基类的表中,而不是为每个子类创建一个表。简单地说,您不期望的这个专栏的唯一来源将是以下两种之一:

  1. Company,或Company的某个子类与Person有直接关系(不是通过CompanyPerson) 配置为一对一

  2. PersonPerson的某个子类与Company有关系

好了,我找到了问题,没想到真正的bug在我身上!

在我的Company表中有这个:

public virtual ICollection<Person> Histories { get; set; }

如果你没听清楚,类型应该是History而不是Person!

public virtual ICollection<History> Histories { get; set; }

谢谢你的帮助!

相关文章: