【问题标题】:The abstract type X has no mapped descendants and so cannot be mapped抽象类型 X 没有映射的后代,因此无法映射
【发布时间】:2015-03-22 17:48:36
【问题描述】:

我有以下型号:

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> { }

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

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

在我看来,这不应该发生,因为 AbstractBase 直接继承自 AbstractBase,而具体的类 Concrete1/2 继承自 GenericAbstractBase。这是怎么回事?

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

更新 1

谁能确认这受 EF 支持?我看过这个post,根据罗文的回答,应该是这样。 谢谢

更新 2 当泛型基类不是抽象的时,同样的问题。

【问题讨论】:

  • Concrete1Concrete2 是否实际映射到您的配置中?
  • 是的,我有这些类型的 DbSet,我还在 OnModelCreating 中明确注册了它们
  • 我认为这可能与stackoverflow.com/questions/12538004/…重复
  • 不,根本不是,他既没有使用代码优先,也没有使用泛型。实际上 EF 团队解决了我的问题,我忘了在这里发布答案。我马上就做。

标签: c# entity-framework


【解决方案1】:

这是from the EF Team的答案:

EDM,EF6 运行时用来推理的底层元模型 实体类型不支持泛型。我们允许非泛型 从要添加到的通用泛型类型继承的实体类型 模型,但是当我们走上继承层次结构时,我们不再寻找 一旦我们遇到一个通用的祖先。你通常使用这个 使用完整的建模实体类型的形状的能力 在 CLR 端的继承和泛型的表现力 事情,但是在 EF 方面,这会导致不相关的实体类型 正在添加中。

这样你就定义了你的 DbContext,从 您正在添加三种不同且不相关的实体类型的 EF6 运行时: AbstractBase、Concrete1 和 Concrete2。中的所有泛型类型 层次结构的中间部分已被忽略,因此 EF 不会 知道它们是相关的。

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

public class ConcreteFork : AbstractBase {  }

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

顺便说一下,在 EF7 中我们去掉了 EDM 层来实现 EF,我们希望能够支持越来越多的场景 实际的通用实体类型。

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

迭戈

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多