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