我在项目中遇到了实体框架(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
那么,有什么建议吗?我至少朝着正确的方向前进了吗?
答案 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; }
}