EF6 -一个表保存所有的联系人对所有其他表
本文关键字:联系人 其他 保存 一个 EF6 | 更新日期: 2023-09-27 18:14:29
好吧,我知道这是奇怪的,但我试图有我所有的联系人在一个表;每个表都将使用另一个表的名称和该表中的ID与另一个表关联。例如,联系人FRED与CompanyID 3的表"Company"相关,而联系人BARNEY与AccountantID 21的表"accounting"相关。
public class Contact: DbContext
{
[Key, Column(Order = 0)]
public string TableName { get; set; }
[Key, Column(Order = 1)]
public int ReferenceID { get; set; }
public string ContactName { get; set; }
}
public class Company: DbContext
{
[Key]
public int CompanyID { get; set; }
public string CompanyName { get; set; }
public virtual List<Contact> Contacts { get; set; }
}
public class Accountant: DbContext
{
[Key]
public int AccountantID { get; set; }
public string AccountantName { get; set; }
public virtual List<Contact> Contacts { get; set; }
}
所以外键不起作用,但是复合键(TableName/ReferenceID)将是唯一的,因此公司可以包含关联联系人的列表(那些具有"Company"TableName和与CompanyID匹配的ReferenceID的联系人)。感觉就像我必须设置modelBuilder这样的东西,但我真的不确定它将如何在这种特殊情况下工作…
modelBuilder.Entity<Company>()
.WithMany(e => e.Contacts)
.HasOptional(d => new { "Company", d.ReferenceID } )
.WillCascadeOnDelete(true);
我将称自己为EntityFrameworkNewbie,所以请原谅任何明显的疏忽。谢谢。
这不是你在EF中可以做到的事情,有几种方法可以解决它,我的建议是多对多的关系(参见http://msdn.microsoft.com/en-gb/data/jj591620.aspx):
modelBuilder.Entity<Company>()
.HasMany(t => t.Contacts)
.WithMany(t => t.Companies)
.Map(m =>
{
m.ToTable("CompanyContacts");
m.MapLeftKey("ContactID");
m.MapRightKey("CompanyID");
});
modelBuilder.Entity<Accountant>()
.HasMany(t => t.Contacts)
.WithMany(t => t.Accountants)
.Map(m =>
{
m.ToTable("AccountantContacts");
m.MapLeftKey("ContactID");
m.MapRightKey("AccountantID");
});
等。
在数据库术语中,这意味着您可以让一个人成为多个客户的联系人,或者让一个人同时成为客户和会计的联系人。这是一种没有正确答案的情况。
另一个选项是TablePerType继承(因此您将创建CompanyContact和AccountantContact对象,这两个对象都继承自contact (http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt)
不要这样做。这不是一个好的关系设计,并且不会给您提供引用完整性,而引用完整性是使用关系数据库的主要好处。
如果每个相关实体只能有一个联系人,则只需在相关实体上添加contactId。如果相关实体可以有多个联系人,则创建一个m:n表来适当地表示这一点(例如CompanyContact表)。