【问题标题】:What might cause Entity Framework to throw an exception with message "(some type) is neither a super-type nor a sub-type of (some other type)"?什么可能导致实体框架抛出异常并显示消息“(某种类型)既不是(某种其他类型)的超类型也不是(某种其他类型)的子类型”?
【发布时间】:2012-06-19 22:18:02
【问题描述】:

我正在处理一个我发现很难调试的 EF 问题...以前,有一个按类型的表继承设置来管理我系统中的不同用户类型 - 一种对所有用户都通用的根类型,以及几个不同的子类型,大致基于使用该帐户的人的类型。现在,我遇到了一些问题,需要我删除继承,而是在每个子类上放置一个 UserId 属性,该属性是用户 Id 属性的外键。因此,现在其他用户类型将拥有用户导航属性,而不是用户。

我已经使用 EDMX 设计器删除了所有继承关联,我添加了所有 UserId 属性及其关联,确保所有其他用户类型现在都有自己的实体键,并获得了关联和导航属性用户设置在每个特定的。但是,当我实际运行我的应用程序时,我收到一个 TargetInvocationException 消息,告诉我“用户既不是(其他类型)的超类型也不是子类型”。

我一直在寻找有关此错误消息的其他参考资料,但找不到任何东西,而且我无法确定是什么原因造成的。在我的 EDMX 中,似乎不再引用 User 和其他类型之间的任何类型的继承,但消息仍然存在。我认识的人从来没有见过它。

我真的没有任何代码可以提供参考;这似乎是一个映射问题。以前有没有人看到过此特定消息的异常?

【问题讨论】:

  • 错误发生在哪一行代码?
  • 堆栈跟踪的前三行:在 System.Data.Common.EntitySql.SemanticAnalyzer。b__74(BuiltInExpr bltInExpr, SemanticResolver sr)... 在 System.Data.Common.EntitySql。 SemanticAnalyzer.ConvertBuiltIn(Node astExpr, SemanticResolver sr)... 在 System.Data.Common.EntitySql.SemanticAnalyzer.Convert(Node astExpr, SemanticResolver sr)... 显然没有可用的行号。它发生在我第一次尝试检索任何类型的实体时。
  • EDMX 中似乎有一些东西表明您的实体是继承的。您是否从数据库中生成了 EDMX?如果是这样,请尝试从更新的数据库中生成新的 EDMX,然后比较 EDMX 文件。

标签: c# entity-framework entity-framework-4


【解决方案1】:

事实证明,问题实际上并不在我所怀疑的 EDMX 内部。通常,当映射出现问题时,代码总是会在同一行发生故障,此时我尝试反射性地实例化实体存储库。由于这是引发异常的地方,我认为这是一个映射问题,但关闭项目的自定义错误表明,在特定存储库的构造函数中,另一个开发人员插入了对 ObjectContext.CreateObjectSet<User>().OfType<(user sub-category type)>() 的调用。这就是导致问题的原因。我怀疑异常在调试时没有向我显示这一行,因为存储库的构造函数被反射调用。更改此调用后,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多