多对多+附加列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将您的CompanyPerson
属性视为复杂类型,因为从本质上讲,它实际上无法与您给它的内容创建M2M关系。无论这实际上是问题与否,无论哪种方式,你都需要修复你的CompanyPerson
属性为:
public virtual ICollection<CompanyPerson> CompanyPersons { get; set; }
最奇怪的部分是,你的History
类将完美地解释这个问题,如果它实际上只被定义为:
public class History : Person
这就是为什么我问你Person
的任何子类,因为EF对继承的默认行为是使用TPH(每个层次结构的表)。换句话说,它只是将所有子类的所有属性添加到基类的表中,而不是为每个子类创建一个表。简单地说,您不期望的这个专栏的唯一来源将是以下两种之一:
Company
,或Company
的某个子类与Person
有直接关系(不是通过CompanyPerson
) 和配置为一对一Person
或Person
的某个子类与Company
有关系
好了,我找到了问题,没想到真正的bug在我身上!
在我的Company表中有这个:
public virtual ICollection<Person> Histories { get; set; }
如果你没听清楚,类型应该是History而不是Person!
public virtual ICollection<History> Histories { get; set; }
谢谢你的帮助!