[英]Many-to-Many + additonal column EF design, it is adding an additional column to my table
我想要以下表格结构:
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列?
更新
好的,我弄清楚了,事实证明这是我没有发布的另一个关联(再次糟糕)。
在我的公司模型中,我对此进行了注释,并生成了正确的表格。 我仍然想要这种联系,所以有人可以告诉我为什么会这样吗?
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; }
UPDATE
最奇怪的部分是,如果仅将History
类定义为:
public class History : Person
这就是为什么我问您有关Person
任何子类的原因,因为EF的默认继承行为是使用TPH(每个层次结构的表)。 换句话说,它将简单地将所有子类的所有属性添加到基类的表中,而不是为每个子类创建一个表。 简而言之,您不会期望本专栏的唯一来源之一:
Company
,或某些子类Company
有直接关系Person
(而不是通过CompanyPerson
) 和它的配置是一比一。
Person
或某些子类Person
有关系Company
。
好的,我发现了问题,并且让我惊讶的是真正的错误出在我身上!
在我的公司表中有:
public virtual ICollection<Person> Histories { get; set; }
如果您不了解,则类型应为“历史记录”而不是“人”!
public virtual ICollection<History> Histories { get; set; }
感谢您提供的所有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.