我想要一份与公司联系的清单。但是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
的解决方案。
答案 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,则可以将所有内容放在同一个表中。