EF - 属性外键

EF - Attribute ForeignKey

我想要一份公司联系人列表。但是 Company 被 ContactExtension 引用,ContactExtension 被 Contact 引用。 我不确定是否可行,但我试试这个:

[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"],就会出现问题,因为Contact中没有CompanyID列。

如何指定 ContactExtension 中的 foreignKey CompanyID?

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

忘记 Companies 和 ContactExtensions table 之间的直接关系 1 到 N。该连接通过联系人 table.

存在

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

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

如果你想做:

var companyContactExtensions = company.ContactExtensions;

您可以只创建一个 ContactExtensions 属性 来为您计算,并且不会映射到数据库。在您的公司内部 class:

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

更新

请阅读您最后的评论:I want to do this : ContactExtension.CompanyID

解决方法是一样的。由于中间有联系人 entity/table,因此 直接 连接不存在。

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

companyExtension.Contact.Company.CompanyID

为此,您将在 ContactExtension class 中创建一个 属性 Contact linking to Contact class 和另一个 属性 Company link 在联系人 class 中联系公司 class。

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

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

PS:我认为您创建了从 Company 到 Contact 以及从 Contact 到 ContactExtensions 的连接,但实际上并不是 "from... to"。这些连接是 "between",因此,您可以 link 相反的方向。

Entity Framework明白你的意思,数据库结构将保持不变。


或者,如果您在 Contacts 和 ContactExtensions 之间建立了 1 对 1 的连接,您可以将所有内容都放在同一个 table。