实体框架6 Code First Fluent API表映射

时间:2015-08-18 23:00:55

标签: c# entity-framework

我在现有数据库中有一个表格,如下所示:

div {
    width: 200px;
    height: 100px;
    background-color: green;
    box-shadow: 0 0 0 15px #000;
}

我需要把它变成这样的类层次结构:

PK
FK
Col1
Col2
Col3
Col4
Col5

我目前正在使用Fluent API配置实体,如下所示:

public abstract class BaseClass : Entity
{
    public int PK {get; set;}
    public string Col1 {get; set;}
}

public class Child1 : BaseClass
{
    public string Col2 {get; set;}
    public string Col3 {get; set;}
}

public class Child2 : BaseClass
{
    public string Col4 {get; set;}
    public string Col5 {get; set;}
}

当我将这些内容添加到上下文中时,继承自public abstract class BaseClassConfig<TEntity> : EntityTypeConfiguration<TEntity> where TEntity : Entity { public BaseClassConfig() { ToTable("TheTableName"); HasKey(x => x.Id); Property(x => x.Col1).HasColumnName("SomeName"); } } public class Child1Config : BaseClassConfig<Child1> { public Child1Config() { Property(x => x.Col2).HasColumnName("SomeName"); Property(x => x.Col3).HasColumnName("SomeName"); } } public class Child2Config : BaseClassConfig<Child2> { public Child2Config() { Property(x => x.Col4).HasColumnName("SomeName"); Property(x => x.Col5).HasColumnName("SomeName"); } }

DbContext

我收到以下错误:

  

实体类型&#39; Child1&#39;和&#39; Child2&#39;无法共享表格&#39; TheTableName&#39;   因为它们不在同一类型层次结构中或没有有效的类型   一对一的外键关系,匹配主键之间   它们。

我看过这篇文章:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

但它并没有真正谈论使用流畅的api来配置类型,而是直接通过protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new Child1Config()); modelBuilder.Configurations.Add(new Child2Config()); } 将它们添加到上下文中。

如何使用流畅的api设置单个表通过基类映射到不同的类?

1 个答案:

答案 0 :(得分:1)

我转向的很好的参考资料是这篇MSDN文章:Configuring/Mapping Properties and Types with the Fluent API

在其中,您将看到对每层次表(TPH)继承模式的引用。基本上你缺少的是一个鉴别器字段(根据错误,FK也没有映射)。

默认情况下,鉴别器列称为Discriminator,但正如您在文章中看到的那样,这可以在代码优先映射中自定义:

modelBuilder.Entity<Course>()  
    .Map<Course>(m => m.Requires("Type").HasValue("Course"))  
    .Map<OnsiteCourse>(m => m.Requires("Type").HasValue("OnsiteCourse"));

在上面的示例中,Type是一个鉴别器,它允许EF在Course时知道要实现的实体类型,即实体Type == "Course"