我想要以下表结构:
Person
-person_id
Company
-company_id
Company_Person
-person_id
-company_id
-other_column
Location
-id
目前,我的EF产生了一个' company_id' Person表中的列也作为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;}
}
我遵循与此处相同的模式:Create code first, many to many, with additional fields in association table
如何在Person表中生成额外的CompanyId列?
更新
好的,我弄明白了,事实证明这是另一个我没有发布的协会(我再一次不好)。
在我的公司模型中,我记下了这个,并且它生成了正确的表格。我仍然想要这种关联,所以有人能告诉我这是怎么回事吗?
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; }
}
因此,当我注释掉历史模型中除Id属性和Company.History属性之外的所有内容时,它生成了我期望的表结构。
答案 0 :(得分:1)
我认为 EF正在将您的CompanyPerson
属性视为一种复杂类型,因为从本质上讲,它实际上无法与您提供的内容建立M2M关系。无论这是否真的存在问题,无论哪种方式,您都需要修复CompanyPerson
属性:
public virtual ICollection<CompanyPerson> CompanyPersons { get; set; }
<强>更新强>
最奇怪的部分是,如果History
课程实际上只被定义为:{/ 1>},那么你的public class History : Person
课程就可以完美地解释这个问题。
Person
这就是为什么我问你关于Company
的任何子类的原因,因为EF的继承默认行为是使用TPH(每个层次结构的表)。换句话说,它只是将所有子类的所有属性添加到基类'表中,而不是为每个子类创建一个表。简单而简单地说,您不期望这个专栏的唯一来源是:
Company
或Person
的某些子类与CompanyPerson
(不是通过Person
)和的直接关系配置为是一对一的。
Person
或Company
的某些子类与{{1}}有关系。
答案 1 :(得分:0)
好的,我发现了问题,真正的错误让我感到惊讶!
在我的公司表中有这个:
public virtual ICollection<Person> Histories { get; set; }
如果你没有抓住它,那么类型应该是历史而不是人!
public virtual ICollection<History> Histories { get; set; }
感谢所有有帮助的人!