【问题标题】:Can I mix Table per Hierarchy and Table per Type in Entity Framework?我可以在实体框架中混合使用每个层次结构的表和每个类型的表吗?
【发布时间】:2011-01-05 15:36:43
【问题描述】:

假设我有 2 个表:Message 和 SuperMessage

还有 3 个实体:Message(基础(非抽象))、Comment(继承自 Message)和 SuperMessage(继承自 Message)

Message 有一个不可为空的 MessageType 字段,用作鉴别器。

  • MessageType = 1 表示它是一条消息
  • MessageType = 2 表示它是一个评论
  • MessageType = 3 AND 并加入 SuperMessage 意味着它是 SuperMessage

问题是我无法在 SuperMessage 的 Mapping details 部分的 MessageType 上指定条件,因为它看不到 MessageType 字段,我无法忽略它。

我怎样才能让这些一起工作?

更新构建错误:

错误 3014:映射片段中的问题:模型中未强制执行从表 SuperMessage (ID) 到表 Message (MessageId) 的外键“外键约束 'FK_SuperMessage_inherits_Message”。需要创建关联或继承关系来强制执行此约束。

【问题讨论】:

  • 如果您只是简单地忽略 SuperMessage 的 MessageType 并允许 TPT 继承启动,它会起作用还是会出错?
  • @jeremcc 是的,我已经尝试过了,我得到了错误(我刚刚在上面添加)
  • 自己玩一个简单的例子。我会告诉你我发现了什么。
  • 如果您在映射窗口中添加Message 表,您应该能够看到MessageType。你这样做了吗?也就是说,我不知道答案,因为我从未尝试过。
  • 我认为这是不可能的,继承策略不能混合在一个继承层次结构中。每个继承的实体类型树都必须遵循一个继承策略。不幸的是,这在 Code-First 中是不可能的。

标签: entity-framework entity-framework-4 linq-to-entities


【解决方案1】:

您是否尝试过添加中间抽象实体类型,即:

abstract     MessageBase      --> Message table
non-abstract Message          --> Message table when MessageType == 1
non-abstract Comment          --> Message table when MessageType == 2
abstract     SuperMessageBase --> Message table when MessageType == 3
non-abstract SuperMessage     --> SuperMessage table

还可以查看我解决的类似场景: EF: Can I mix TPH and TPT when abstract base and a few concrete types are in TPH-table and other types have their own table?

【讨论】:

    【解决方案2】:

    我复制了这个并且得到了和你一样的错误。据我所知,似乎不可能将这两种继承类型组合到一个基表中。不过,我很想被证明是错误的。 ;-)

    【讨论】:

    • 从几个人那里听说这种特殊情况是不可能的。所以我认为你是对的 - 不幸的是;)
    • 这个答案似乎另有建议:-) stackoverflow.com/a/6035516/910482
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多