EF - 属性ForeignKey

时间:2015-03-30 14:55:13

标签: c# .net entity-framework attributes

我想要一份与公司联系的清单。但是ContactExtension引用了Company,Contact引用了ContactExtension。 我不确定它是否可行,但我试试这个:

[Table("Company", Schema = "dbo")] 
public class Company
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [ForeignKey(?)]
    public virtual ICollection<Contact> MyContacts { get; set; }
}

[Table("Contact", Schema = "dbo")]
public class Contact
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [Column("ContactExtensionID")]
    public int ContactExtensionID { get; set; }
    [ForeignKey("ContactExtensionID")]
    public virtual ContactExtension ContactExtension { get; set; }
}

[Table("ContactExtension", Schema = "dbo")]
public class ContactExtension
{
    [Column("ID")]
    [Key]
    public int ID { get; set; }
    [Column("Name")]
    public String Name { get; set; }
    [Column("CompanyID")]
    public int CompanyID { get; set; }
}

如果我写ForeignKey["CompanyID"],则会出现问题,因为联系人中没有CompanyID列。

如何在ContactExtension中指定foreignKey CompanyID?

我想找到一个没有Fluent Api的解决方案。

1 个答案:

答案 0 :(得分:1)

忘记公司和ContactExtensions表之间的直接关系1到N.该连接通过Contacts表存在。

然后,如果您想从公司实例引用ContactExtensions,您可以这样做:

var tenthContact = company.Contacts.ElementAt(10);
var contactExtension = tenthContact.ContactExtension;

如果你想这样做:

var companyContactExtensions = company.ContactExtensions;

您可以创建一个ContactExtensions属性,为您计算该属性,但不会映射到数据库。在公司课程内:

public ICollection<CompanyExtension> CompanyExtensions
{
      get
      {
          return this.CompanyContacts.SelectMany(c => c.ContactExtension).ToList();
      }
}

更新

请阅读您的上一条评论:I want to do this : ContactExtension.CompanyID

解决方案是一样的。由于中间有一个Contacts实体/表,因此 direct 连接不存在。

如果您真的想要该属性,可以使用Contact和ContactExtension之间的1对1关系,然后引用该公司:

companyExtension.Contact.Company.CompanyID

为此,您将创建一个属性Contact,链接到ContactExtension类中的Contact类,另一个属性Company链接到Contact类中的Company类。

为了直接执行此操作,您将创建另一个未映射到为您计算的数据库的属性:

public int CompanyID
{
  get
  {
    return this.Contact.Company.CompanyID;
  }
}

PS:我认为您认为您创建了从公司到联系人以及从联系人到ContactExtensions的连接,但它实际上并非从......到#34;。这些联系是&#34;在&#34;之间因此,你可以向相反的方向链接。

实体框架理解您的意思,数据库结构将保持不变。


或者,如果您在Contacts和ContactExtensions之间连接1到1,则可以将所有内容放在同一个表中。