多对多+额外的列EF设计,它在我的表中添加了一个额外的列

时间:2014-08-08 19:46:24

标签: c# asp.net-mvc entity-framework entity-framework-6.1

我想要以下表结构:

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属性之外的所有内容时,它生成了我期望的表结构。

2 个答案:

答案 0 :(得分:1)

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

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

<强>更新

最奇怪的部分是,如果History课程实际上只被定义为:{/ 1>},那么你的public class History : Person 课程就可以完美地解释这个问题。

Person

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

  1. CompanyPerson的某些子类与CompanyPerson(不是通过Person的直接关系配置为是一对一的。

  2. PersonCompany的某些子类与{{1}}有关系。

答案 1 :(得分:0)

好的,我发现了问题,真正的错误让我感到惊讶!

在我的公司表中有这个:

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

如果你没有抓住它,那么类型应该是历史而不是人!

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

感谢所有有帮助的人!