什么可能导致实体框架引发带有消息"(some type) is neither a super-type nor a sub-type of (some other type)"的异常?



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

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

我一直在寻找对此错误消息的其他引用,但找不到任何东西,我无法确定是什么原因造成的。在我的 EDMX 中,用户和其他类型的继承之间似乎不再有任何类型的继承引用,但消息仍然存在。我认识的人以前从未见过它。

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

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

相关内容

最新更新