【问题标题】:Modelling a directed graph in EF CF在 EF CF 中建模有向图
【发布时间】:2012-06-07 16:23:49
【问题描述】:

我在使用 EF Code First 对图形结构进行建模时遇到了一些问题。我有一种情况,即我的应用程序中的许多具体对象可以是与多种边缘类型中的任何一种相关的节点。

例如,两个用户对象可能有关系(喜欢、不喜欢、相关),但每个对象都可以同样地与另一种类型的对象相关(“查看”页面、“喜欢”消息等)

为了在应用程序中对此进行建模,我使用了 GraphNode 的基类,所有可能的节点都将从该基类继承,并且每个 GraphNode 都有一个 Edge 集合。每个 Edge 都有一个 SourceNode、一个 DestinationNode 和一个 RelationshipType(用于加权)。

我知道如何将其建模为直接的数据库优先开发,其中包含一个用于 Edge 的表,该表将具有一个代理键、SourceObjectID 和 DestinationObjectID 字段,这将是来自被链接对象的 PK、SourceObjectType 和 DestinationObjectType 字段是相关对象的类型,但该站点需要 EF Code First 实现。

我已经到了使用 TPT 继承的地步,所以我有一个 GraphNode 表,其 PK 是 GraphNodeID,但它随后将其用作每个表的 PK类型,而不是它们自己的 PK,这会导致问题。

有没有人这样做过,或者任何人都可以为我指明正确的方向以找到一种方法来做到这一点?

【问题讨论】:

    标签: c# .net entity-framework graph ef-code-first


    【解决方案1】:

    正如您所发现的,继承并不适合这种情况。

    其他 ORM,如 NHibernate,为“异构关联”提供开箱即用的支持。由于 EF 没有,我的解决方案是在“服务”层(即控制器/视图模型和 DbContext 之间)处理这个问题。

    我所做的是创建一个抽象,让我可以存储和检索与任何实体关联的元素(在我的例子中,Notes 或 Comments)。我通过手动存储被引用对象的实体类型和 id 来做到这一点。

    这几乎是微不足道的,除非您想将元素与非持久实体相关联(我使用 DbContext 中的一些回调来处理)

    【讨论】:

    • 听起来和我最终做的差不多。它可能不像我希望的那样优雅,但它肯定是我知道的一种工作模式。我将选择一种无节点版本,因此我的 EF 实体只是边缘,具有 SourceID、SourceType、DestinationID、DestinationType 和 RelationshipType,并且正如您所建议的,我必须处理基于指定类型和 ID 的选择与数据库之间的关系。
    猜你喜欢
    • 2012-06-17
    • 2011-07-30
    • 2012-05-05
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多