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。
我想要一份公司联系人列表。但是 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。