繁体   English   中英

多对多+附加列EF设计,正在向我的表添加一个附加列

[英]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(每个层次结构的表)。 换句话说,它将简单地将所有子类的所有属性添加到基类的表中,而不是为每个子类创建一个表。 简而言之,您不会期望本专栏的唯一来源之一:

  1. Company ,或某些子类Company有直接关系Person (而不是通过CompanyPerson它的配置是一比一。

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM