【问题标题】:Many-to-Many + additonal column EF design, it is adding an additional column to my table多对多 + 附加列 EF 设计,它在我的表中添加了一个附加列
【发布时间】:2014-08-08 19:46:23
【问题描述】:

我想要如下表结构:

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;}
 }

我遵循与此处相同的模式: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; }
}

因此,当我注释掉 History 模型中除 Id 属性和 Company.History 属性之外的所有内容时,它生成了我期望的表结构。

【问题讨论】:

  • 不是也给Company添加了PersonID?
  • 一秒钟我要进行编辑,忘记了 1 个模型
  • @Pheonixblade9 我用另一个模型更新了我的问题,以防对 EF 造成一些“混乱”。
  • 这更没有意义。这个History 类和Person 之间甚至没有关系。继续挖掘。肯定有更多,因为您仍然没有任何代码会导致这种情况。
  • 也许这是 EF 6.1 中的一个错误?我可以在 OnModelCreating 事件中添加一些内容以使其更加明确吗?

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


【解决方案1】:

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

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

更新

最奇怪的是,如果您的 History 类仅实际定义为:

public class History : Person

这就是为什么我向您询问Person 的任何子类的原因,因为 EF 的默认继承行为是使用 TPH(每个层次结构的表)。换句话说,它将简单地将所有子类的所有属性添加到基类的表中,而不是为每个子类创建一个表。简而言之,您没想到的本专栏的唯一来源将是以下任一来源:

  1. Company,或Company 的某个子类与Person 有直接关系(不通过CompanyPerson并且它被配置为一对一。

  2. PersonPerson 的某个子类与Company 有关系。

【讨论】:

  • 嗨,克里斯,该物业的末尾确实有一个“s”,我的错字很抱歉。我用另一个模型(位置)更新了我的问题,以防万一导致问题。
  • s 不是重要的部分。 ICollection&lt;CompanyPerson&gt; 的类型是。
  • 克里斯,我非常非常抱歉,这是我最初拥有的。我已经在我的 Q 中解决了这个问题。再次,很抱歉在这个问题上浪费你的时间,因为它是一种类型,我有。
  • 如果你已经有了,那么我们回到这里没有什么会导致这种情况发生。除了您发布的内容之外,肯定还有其他内容与您的 Person 类交互以添加该列。
  • 似乎 EF 没有在查看 Person.CompanyPersons 集合的 CompanyPerson 连接表。然后它以某种方式在 Person 表中创建了一个 companyId 列。不知道为什么要这样做! :)
【解决方案2】:

好的,我发现了问题,让我惊讶的是真正的错误竟然出现在我身上!

在我的公司表中有这个:

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

如果你没听懂,类型应该是 History 而不是 Person!

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

感谢所有为此提供帮助的人!

【讨论】:

  • 很高兴你找到了它。不过,在未来,请准确地复制并粘贴您的代码在您的项目中的存在方式。如果您没有同时重写代码并具有讽刺意味地修复您的错误,我们可能从一开始就能够发现这一点。
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2023-04-10
  • 2011-12-20
  • 1970-01-01
相关资源
最近更新 更多