我在使用EF Code First模拟图形结构时遇到了一些麻烦。我的情况是,我的应用程序中的许多具体对象可以是与多种类型的边缘相关的节点。
例如,两个User对象可能有关系(喜欢,不喜欢,相关),但每个对象可能同样与另一种类型的对象相关('查看'页面,'喜欢'消息等)。
要在应用程序中对此进行建模,我正在使用GraphNode的基类,所有可能的节点都将从该基类继承,并且每个GraphNode都有一个Edges集合。每个Edge都有一个SourceNode,一个DestinationNode和一个RelationshipType(用于加权)。
我知道如何将其建模为直接的数据库优先开发,其中Edge表具有代理键,SourceObjectID和DestinationObjectID字段,它们是来自被链接对象的PK,SourceObjectType和DestinationObjectType字段是相关对象的类型,但该站点需要EF Code First实现。
我已经达到了我正在使用TPT继承的地步,所以我有一个带有PK的GraphNode表是GraphNodeID,但它然后用它作为每个表的PK用于具体类型,代替他们自己的PK会导致问题。
有没有人这样做过,或者有人能指出我正确的方向来做到这一点吗?
答案 0 :(得分:0)
正如您所知,继承不适合这种情况。
其他ORM,如NHibernate,为“异构关联”提供开箱即用的支持。由于EF没有,我的解决方案是在“服务”层处理(即在控制器/视图模型和DbContext之间)。
我所做的是创建一个抽象,让我存储和检索与任何实体相关联的元素(在我的情况下,注释或注释)。我这样做是通过手动存储引用对象的实体类型和id。
除非您想要将元素与非持久性实体相关联(我在DbContext中使用某些回调处理它),否则这几乎是微不足道的。