我尝试使用TPC样式的Entity Framework映射一些类,并出现以下错误:
错误:类型' A'因为映射而无法按定义映射 从使用实体拆分或其他类型的类型继承属性 继承的形式。选择不同的继承映射 策略,以便不映射继承的属性,或更改所有类型 用于映射继承属性和不使用拆分的层次结构。
使用以下类时会发生此错误:
public abstract class BaseEntityTest
public abstract class BaseEntityTest2 : BaseEntityTest
public abstract class BaseEntityTest3 : BaseEntityTest2
public class A: BaseEntityTest3 // this class is the only one with a table in the db
在OnModelCreating方法中,我添加了以下代码以获取TPC映射
modelBuilder.Entity<A>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("A");
});
当我从结构中排除BaseEntityTest2时(因此A仅从BaseEntityTest而不是BaseEntityTest2继承),错误消失了。这是否意味着无法创建此映射或我只是错过了什么?
编辑:
班级属性:
public abstract class BaseEntityTest
{
[Key]
public Guid Id { get; set; }
public String Info { get; set; }
[Required]
public DateTime CreationDate { get; set; }
[Required]
public String CreationUser { get; set; }
[Required]
public DateTime ModificationDate { get; set; }
[Required]
public String ModificationUser { get; set; }
[ConcurrencyCheck]
[Required]
public int LockVersion { get; internal set; }
}
public abstract class BaseEntityTest2 : BaseEntityTest
{
[Required]
public string Name { get; set; }
public string Description { get; set; }
}
public abstract class BaseEntityTest3: BaseEntityTest2
{
[Required]
public DateTime FromDate { get; set; }
public DateTime ThruDate { get; set; }
}
public class A: BaseEntityTest3{
public String Test { get; set; }
}
答案 0 :(得分:6)
EF 4.3.1及更早版本发生错误,但EF 4.4和EF 5.0不发生错误。 (EF 4.4实际上是EF 5.0,但是以.NET 4.0作为目标平台。)
但是:只有在模型中使用抽象类作为实体时才会出现错误,这意味着
您在上下文类中拥有DbSet
个,例如
public DbSet<BaseEntityTestX> BaseEntityTestXs { get; set; }
或者您有BaseEntityTestX
的一些Fluent映射,一些modelBuilder.Entity<BaseEntityTestX>()...
内容
或者您正在使用BaseEntityTestX
之一作为另一个(具体)实体类型的导航属性
你需要这些吗?
如果您真的想要查询其中一个抽象实体,那么在您的上下文中只有DbSet<BaseEntityTestX>
才有意义,例如:
List<BaseEntityTest> list = context.BaseEntityTests
.Where(b => b.Info == "abc").ToList();
结果当然是一个继承自BaseEntityTest
的具体实体的列表,但它可以是不同类型的混合,例如一些A
和一些B
。你需要这样的询问吗?或者您只想查询一些具体对象:
List<A> list = context.As
.Where(b => b.Info == "abc").ToList();
在后一种情况下,您不需要DbSet
作为抽象基类,也不需要任何继承映射。您只需从上下文类中删除DbSet<BaseEntityTestX>
并删除TPC映射,您的错误就会消失。
最后一点 - 具有导航属性到另一个实体中的一个抽象实体 - 对于TPC映射没有意义。它只是不能映射到关系数据库,因为使用TPC映射时,抽象实体没有表,因此外键关系可以从具有导航属性的具体类的表中引用。
如果将TPC映射扩展到基类,错误也将消失:
modelBuilder.Entity<BaseEntityTestX>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("BaseEntityTestX");
});
但它会为那些对我来说似乎没有意义的抽象实体创建表格。
答案 1 :(得分:2)
EntityTypeConfiguration&#39;&LT;&#39; YourBaseClass&#39;&GT;&#39;
没有使用
详细说明 ALL 您的派生类 this.Map<DerivedClass1>(m =>
{
m.MapInheritedProperties();
m.ToTable("..");
});
如果汇编中只有一个类似的配置没有这样配置 你得到这个例外