【问题标题】:Entity framework and inheritance: NotSupportedException实体框架和继承:NotSupportedException
【发布时间】:2015-08-10 06:02:34
【问题描述】:

我来了

System.NotSupportedException:全部 EntitySet 中的对象 'Entity.Message' 必须具有唯一性 主键。然而,一个实例 输入“Model.Message”和一个实例 'Model.Comment' 类型的两者都有 相同的主键值

但我不知道这是什么意思。

使用 EF4,我有一堆消息类型的实体。这些消息中的一些实际上是子类型,评论,按表类型继承。只是

 DB.Message.First();

会产生异常。我还有其他没有遇到问题但看不到任何差异的子类型实例。但有时,如果我重新启动开发服务器,问题就会消失,但并非总是如此。

编辑: 我已经解决(以前应该有)问题是存储过程获取我的消息的错误。当前设置的方式是获取与 Message 相关的所有字段,存储过程忽略 Comment 表。然后上下文继续解决这个问题,可能是通过再次获取那些也是评论的消息,正如你所建议的那样。如何正确地做到这一点是当前的核心问题。我在http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb0bb421-ba8e-4b35-b7a7-950901adb602 找到了一些解决方案的迹象。

【问题讨论】:

  • 你能贴出 Message 和 Comment 类的签名吗?
  • 对不起,我不明白你的意思。你想见成员吗?全部还是 EF 生成的?
  • 复杂。直觉:不适用。如果一切都失败了,我会调查一下。
  • 你能把图表的屏幕截图贴出来吗?

标签: entity-framework entity-framework-4


【解决方案1】:

正如您推断的那样,上下文似乎正在将评论作为消息获取(不知道它是评论)。稍后,您请求实际的评论,因此上下文获取评论。现在您在 Context 中有两个具有相同 ID 的对象实例 - 一个是 Message,一个是 Comment。

似乎直到两个对象都被加载之后(即当您第二次尝试访问消息时)才引发异常。如果您能找到一种在加载评论时从上下文中删除消息的方法,这可能会解决您的问题。

另一种选择可能是使用每层级表模型。这会导致糟糕的数据库设计,但最终您必须使用有效的方法。

您可以通过确保先将对象作为评论加载来避免该问题。这样,当您请求消息时,上下文已经知道它。

还可以考虑使用Composition over Inheritance,这样一条消息就有 0..1 个 CommentDetails。

最后的建议是从您的控制代码中删除对实体框架的依赖,并创建一个引用 EF 并检索您的对象的数据访问层。 DAL 可以将实体框架对象转换为更易于在代码中使用的不同实体对象集。这种方法会产生大量的代码开销,但如果您不能使用实体框架来生成一个实体模型,该模型以您希望使用它们的方式表示您的实体,那么这种方法可能是合适的。

总而言之,除非 MS 解决了这个问题,否则没有不涉及重新思考您的方法的问题的解决方案。不幸的是,实体框架并不理想,尤其是对于复杂的实体模型 - 您最好创建自己的 DAL 并完全绕过 EF。

【讨论】:

    【解决方案2】:

    听起来您正在将两条记录拉入内存,一条拉入消息,一条拉入评论。

    可能的问题:

    • 有两条 id 相同的物理消息
    • 将同一条消息作为消息和评论拉取
    • 同一条消息被两次提取到同一上下文中

    当您重新启动时问题有时会消失,这表明清理上下文存在问题。您是否使用“使用”语句。

    您有将消息更改为评论的功能吗?

    【讨论】:

      【解决方案3】:

      我不是 EF 类型的人(忙于与 NHibernate 合作,还没有时间了解 EF 的最新信息)所以我在这里可能完全错了,但问题可能在于这两个表(因为您正在使用每个类型的表继承)具有冲突的主键?

      如果检查两个表中的数据,主键值是否冲突?

      【讨论】:

      • 嗯,是的,他们应该这样做。如果你不相信我,相信EF。有一个漂亮的小命令叫做“从模型构建数据库”......
      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 2011-05-19
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多