【问题标题】:Entity Framework Polymorphism实体框架多态
【发布时间】:2010-04-09 12:37:49
【问题描述】:

在尝试使用 Entity Framework 实现简单的多态关系时,我需要一些帮助。

我想实现的关系示例:

评论表格

  • ItemType(“视频”、“用户”)
  • 物品ID
  • 身体

视频有很多评论

用户有很多评论

不知道最好的方法,我来自 Ruby on Rails 的思维方式。

【问题讨论】:

  • 多态性(ItemType?)在哪里?
  • 多态是指 Video 和 User 共享一个有 Comments 的基类吗?
  • 我相信他的意思是关系本身是多态的,它是视频->评论或用户->评论。参见例如wiki.rubyonrails.org/howtos/db-relationships/polymorphic 所以数据库中有两个单独的FK 关系,但您需要一个接口。例如 IHasComments,您可以将用户或视频投射到 IHasComments,然后访问 .Comments 以获取它们。继承是一个单独的问题 - 您可以使用或不使用 User 和 Video 之间的继承关系以及某些常见的父类型来执行此操作。

标签: c# asp.net entity-framework polymorphism


【解决方案1】:

这不需要多态性(继承)。

您说得对:视频评论。继承需要:视频评论。

【讨论】:

    【解决方案2】:

    您的基本选择是:-

    1.继承 模型 VideosUsers 作为 Items 的子类:-

    1.1。每个类的表继承(因此一个表用于视频,一个用于用户)

    1.2 Table-per-hierarchy 继承(因此一个表同时包含视频和用户(某些类型的某些字段隐藏)

    我建议您查找实体框架的每类表和每层次表。

    2。使用通用接口(例如 ICommentableObject<..>、ICommentableObjectContext<...>) 这允许您在 VideoComment 和 UserComment 之间拥有单独的 Video、User、Comment 表和 FKrelationships(更一般地,对于您想要评论的任何其他表)。

    这是可行的,但它非常复杂。例如,我有一个 ITaggable 实现,它可以将标签应用于任何 ObjectContext 以及其中支持给定接口的任何对象——但这并不容易。

    【讨论】:

    • 尽管您已经很久没有回答这个问题了,但是您能否提供一个示例来说明您是如何创建 ITaggable 的,或者复杂性在哪里?
    【解决方案3】:

    在我看来,您应该像这样对 DB 进行建模:

    表格:

    项目(ItemID、ItemType、Body)

    用户(用户 ID,...)

    评论(CommentID、ItemID、UserID)

    那么你的实体之间的关系应该没有任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2013-04-05
      • 1970-01-01
      相关资源
      最近更新 更多