我在使用EF Code First建模图形结构时遇到了一些麻烦。我遇到这样的情况,我的应用程序中的许多具体对象可以是与许多类型的边相关的节点。

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

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

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

我已经到了使用TPT继承的地步,所以我有一个GraphNode表,其中的PK是GraphNodeID,但随后将其用作具体类型的每个表的PK,在自己的PK的位置,这会引起问题。

有没有人这样做过,或者有人可以为我指出正确的方向呢?

最佳答案

如您所知,继承不适用于这种情况。

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

我要做的是创建一个抽象,使我可以存储和检索与任何实体相关联的元素(在我的情况下为Notes或Comments)。我通过手动存储所引用对象的实体类型和ID来做到这一点。

除了要将元素与尚未持久的实体关联(我在DbContext中使用一些回调来处理)外,这通常很简单。

关于c# - 在EF CF中建模有向图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10935861/

10-13 06:00