如果我有类似的课程
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是否可以在没有基本实体表的情况下对此进行映射?
答案 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时,您将收到任何历史记录。
此实现有两个严重警告:
最终,如果希望在基类中使用子级引用,最好使用逐级表配置,否则将历史记录分为两个类并将关系升至实现类。