EF 6 - TPC - 多对多关系

时间:2014-11-05 19:51:54

标签: asp.net-mvc many-to-many entity-framework-6

我在项目中遇到了实体框架(6)的代码优先方法。我实际上有一个数据库,我试图编写将导致实体框架复制的代码。到目前为止我已经接近了,但不是100%。第一个问题是多对多关系:

我有一个名为Consumer的基类,它只有基本属性:

public abstract class Consumer
{
    public Guid ID { get; set; }
    [DataType(DataType.DateTime)]
    public DateTime CreateDate { get; set; }
    [DataType(DataType.DateTime)]
    public DateTime? LastModDate { get; set; }
    public int RecordStatus { get; set; }
}

然后我想为后续类使用继承:

public class Entity : Consumer
{
    [DisplayName("Entity Name")]
    public string EntityName { get; set; }
    [DisplayName("Phone Number"]
    public string PhoneNumber { get; set; }
    [DisplayName("Doing Business As"]
    public string DBA { get; set; }
}

在我的上下文类中,我成功地将所有属性映射到表:

modelBuilder.Entity<Entity>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("Entity");
    });

我继续这个设计与其他类(例如联系人):

public class Contact : Consumer
{
    [DisplayName("First Name")]
    public string FirstName { get; set; }
    [DisplayName("Last Name"]
    public string LastName { get; set; }
}

现在,显然,联系人可能与多个实体相关,而实体可能与多个联系人相关。我该如何编码呢?我唯一能想到的就是创建一个像这样的相关类:

public class RelatedContact
{
    public Guid ID { get; set;} 
    public Guid ContactID { get; set; }
    public virtual Contact Contact { get; set; }
    public Consumer Parent { get; set; }
    public virtual Consumer Parent { get; set; }
    public Guid RelationshipTypeID { get; set; }
    public virtual RelationshipType RelationshipType { get; set; }
}

然后在创建相关类后,我假设我需要像这样更新我的Entity类:

public class Entity : Consumer
{
    [DisplayName("Entity Name")]
    public string EntityName { get; set; }
    [DisplayName("Phone Number"]
    public string PhoneNumber { get; set; }
    [DisplayName("Doing Business As"]
    public string DBA { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

然后,我会更新我的DbContext以映射许多关系,但我不知道正确的语法,或者这是否是正确的方法来解决这个问题。我想要输出以下表格:

<<Entity>>
ID uniqueidentifier,
CreateDate datetime,
LastModDate datetime,
RecordStatus int,
EntityName varchar(250),
PhoneNumber varchar(100),
DBA varchar(250)

<<Contact>>
ID uniqueidentifier,
CreateDate datetime,
LastModDate datetime,
RecordStatus int,
FirstName varchar(100),
LastName varchar(100)

<<RelatedContact>>
ID uniqueidentifier,
ContactID uniqueidentifier,
ParentID uniqueidentifier,
RelationshipTypeID uniqueidentifier

那么,有什么建议吗?我至少朝着正确的方向前进了吗?

1 个答案:

答案 0 :(得分:1)

要创建多对多关系,您需要使用第二种方法。只需将导航集添加到您的Entity和Contact类。 EF将为您创建链接表并跟踪链接。

public class Entity : Consumer
{
    ... your props

    public virtual ICollection<Contact> Contacts { get; set; }
}

public class Contact : Consumer
{
    ... your props

    public virtual ICollection<Entity> Entities { get; set; }
}