EF 6-TPC-多对多关系



我在项目中使用实体框架(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

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

要创建多对多关系,需要使用第二种方法。只需将导航集合添加到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; }
}

最新更新