【发布时间】:2015-08-18 23:00:54
【问题描述】:
我在现有数据库中有一个表,如下所示:
PK
FK
Col1
Col2
Col3
Col4
Col5
我需要将它放入这样的类层次结构中:
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;}
}
我目前正在使用 Fluent API 来配置实体,如下所示:
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:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new Child1Config());
modelBuilder.Configurations.Add(new Child2Config());
}
我收到以下错误:
实体类型“Child1”和“Child2”不能共享表“TheTableName” 因为它们不在同一类型层次结构中或没有有效的 与匹配主键的一对一外键关系 他们。
但它并没有真正谈论使用fluent api来配置类型,而是直接通过DbSet<>将它们添加到上下文中。
如何使用 fluent api 设置单个表以通过基类映射到不同的类?
【问题讨论】:
-
为什么要将实体类拆分为三个类?同样,当您在抽象 BaseClassConfig 中定义表名并在其他两个 ChildConfig 类中实现它时,这并没有说明要在数据库中映射的实际实体。你怎么称呼这些配置?如果您想要表结构,则 child2 类应从子 1 继承并将 ToTableName 调用移动到 Child2Config
-
@SandeepKumar - 因为
BaseClass与Child1和Child2具有共同的属性,而它们每个都有自己的属性,彼此不相关。它是最简单形式的继承。但在这种情况下,现有模式的所有属性都存储在同一个表中。 -
对于 EF,实体应该映射到数据库表。 EF 代码的目的首先是将实体关联到数据库表,并且实体应仅用于此目的。如果你打算对这个类层次结构做一些事情,那么首先你为表创建一个简单的实体,然后你必须用这个层次结构创建其他类(如 DTO)并在你的应用程序中使用它们。使用自动映射器或创建映射方法来处理从 DTO 到实体的请求。这会将您的应用程序特定责任从实体转移到 DTO。
标签: c# entity-framework