2

我在使用 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的地方,这将导致问题。

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

4

1 回答 1

0

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

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

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

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

于 2012-06-08T13:12:52.603 回答