抽象类型X没有映射的后代,因此无法映射

tob*_*777 9 c# entity-framework

我有以下型号:

public abstract class AbstractBase { }
public abstract class AbstractBase<T> : AbstractBase where T : SomeOtherTypeBase
{
    T MyProp {get; set;}
}
public class Concrete1 : AbstractBase<OtherTypeSpecializationFor1> { }
public class Concrete2 : AbstractBase<OtherTypeSpecializationFor2> { }
Run Code Online (Sandbox Code Playgroud)

但是实体框架给了我错误:

抽象类型AbstractBase没有映射的后代,因此无法映射

在我看来,这不应该发生,因为AbstractBase直接继承自AbstractBase和Concrete1/2这些具体继承自GenericAbstractBase的类.这里发生了什么 ?

另外,出于好奇,我想知道GenericAbstractBase中T类型的属性是否会被EF保留,以防有人经过时考虑到答案.

更新1

任何人都可以确认这是EF支持吗?我已经看过这篇文章了,根据罗文的回答,这应该是这样的.谢谢

更新2 通用基类不是抽象时的相同问题.

tob*_*777 6

以下是EF团队的答案:

EDM是EF6运行时用来推理实体类型的底层元模型,它不支持泛型.我们允许将从公共泛型类型继承的非泛型实体类型添加到模型中,但是当我们走上继承层次结构时,一旦我们触及通用祖先,我们就会停止查看.在CLR方面,您通常使用此功能使用继承和泛型的完整表现来模拟实体类型的形状,但是在EF方面,这会导致添加不相关的实体类型.

这样就定义了你的DbContext,从EF6运行时的角度来看,你要添加三种不同且不相关的实体类型:AbstractBase,Concrete1和Concrete2.层次结构中间的所有泛型类型都被忽略,因此EF不知道它们是相关的.

考虑到这一限制,您需要获得异常,因为AbstractBase是抽象的,并且没有任何具体的后代知道EF.如果添加一个直接从AbstractBase继承的单独的非泛型和具体类型,例如:

public class ConcreteFork : AbstractBase {  }
Run Code Online (Sandbox Code Playgroud)

您的模型应该再次有效.但是,您将无法使用MyContext.AbstractBases来引导返回Concrete1或Concrete2实例的查询,因为EF并不知道它们是相关的.

顺便说一句,在EF7中我们摆脱了EDM层以实现EF,我们希望能够为实际的通用实体类型支持越来越多的场景.

希望这有助于解释发生了什么.

迭戈