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,所以请原谅任何明显的疏忽。谢谢。

EF6 -一个表保存所有的联系人对所有其他表

这不是你在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表)。