将关系映射到实体框架中的基类

时间:2018-09-12 16:02:01

标签: c# entity-framework inheritance

如果我有类似的课程

public class BaseEntity
{
    public int Id {get;set;}
    public DateTime CreatedOn {get;set;}
    public DateTime ModifiedOn {get;set;}

    public IList<ModuleHistory> History {get;set;}
}

public class FirstEntity : BaseEntity
{
    public string FirstEntityProperty {get;set;}
}

public class SecondEntity : BaseEntity
{
    public string SecondEntityProperty {get;set;}
}

public class ModuleHistory
{
    public string Field {get;set;}
    public string FromValue {get;set;}
    public string ToValue {get;set;}

    public BaseEntity Module {get;set;}
}

我想为FirstEntities创建一个表,为SecondEntities创建一个表,为ModuleHistories创建一个表。我想,ModuleHistories需要为BaseEntityId提供一列,为BaseEntityType提供一个列(FirstEntity,SecondEntity)。我的第一次尝试有效,但是导致创建了BaseEntities表。 EF是否可以在没有基本实体表的情况下对此进行映射?

1 个答案:

答案 0 :(得分:0)

要使用每种具体类型的表,请使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul> <li id="one"> <a href="#"> first</a> <div class="one"> <ul> <li data-at="some-link" id="two"> <a href="#"> some</a> </li> <li data-at="path-link" id="two"> <a href="#"> path</a> </li> <li data-at="another-one" id="two"> <a href="#"> another one</a> </li> </ul> <div class="dropdown"> <div class="two" id="some-link">some link text</div> <div class="two" id="path-link">path link</div> <div class="two" id="another-one">another one</div> </div> </div> </li> <li id="one"> <a href="#"> second</a> <div class="one"> <ul> <li> <a href="#"> another some</a> </li> <li> <a href="#"> another path</a> </li> </ul> </div> </li> <li id="one"> <a href="#"> third</a> <div class="one"> <ul> <li> <a href="#"> third some</a> </li> <li> <a href="#"> third path</a> </li> </ul> </div> </li> </ul>告诉EF基类属性是子类表的一部分。

对于EntityTypeConfiguration设置:

MapInheritedProperties

如果您使用modelBuilder设置实体,则:

public class MyEntityConfiguration : EntityTypeConfiguration<MyEntity>
{
  public MyEntityConfiguration()
  {
    Map(x => x.MapInheritedProperties());
    ToTable("MyEntities");
  }
}

在下面编辑 (也是上面编辑过的示例,MapInheritiedProperties必须在ToTable之前)

如果要在基类级别建立子关系,则应将数据模型构造为按层次结构的表,而不是按具体表的表,因为表之间的FK关系是一对一的关系。 ModuleHistory不能具有指向“ FirstEntity”或“ SecondEntity”的FK。

虽然我不确定要使用Code-First尝试使用它,但可以获取EF来映射它。使用实体配置:

给出原始示例的类结构:

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

然后,当您获取FirstEntity或SecondEntity时,您将收到任何历史记录。

此实现有两个严重警告:

  1. 您在模块历史记录上失去了FK约束,因此数据库将无法为孤儿提供保护(没有级联删除),也无法为历史记录与父级之间提供正确的关联。
  2. 您必须对TpCC表上的PK负责,以避免在FirstEntity和SecondEntity之间重复键的可能性。这里的选项包括表之间的共享序列,或使用UniqueIdentifier(/ w NewSequentialId())

最终,如果希望在基类中使用子级引用,最好使用逐级表配置,否则将历史记录分为两个类并将关系升至实现类。