我在使用EF Code First建模图形结构时遇到了一些问题。我有一种情况,在我的应用程序中,许多具体的对象可以是与许多类型的边中的任何一种相关的节点。
例如,两个用户对象可以具有关系(喜欢、不喜欢、相关),但是每个用户对象都可以等同地与另一类型的对象(“已查看”页面、“喜欢”消息等)相关。
为了在应用程序中对此进行建模,我使用了一个GraphNode基类,所有可能的节点都将从该基类继承,并且每个GraphNode都有一个边集合。每条边都有一个SourceNode、一个DestinationNode和一个RelationshipType (用于加权)。
我知道如何将此建模为直接的数据库优先开发,与边缘的表将有一个代理键,SourceObjectID和DestinationObjectID字段将是从被链接的对象的PKs,SourceObjectType和DestinationObjectType字段是相关的对象的类型,但该网站需要EF代码优先实施。
我已经达到了使用TPT继承的程度,所以我得到了一个带有PK的GraphNode表,这个PK是GraphNodeID,但是它使用它作为具体类型的每个表的PK,而不是它们自己的PKs,这会导致问题。
有没有人这样做过,或者有人能给我指出正确的方向来做这件事吗?
发布于 2012-06-08 21:12:53
正如您已经发现的,继承并不适合此场景。
其他ORM,如NHibernate,提供了对“异构关联”的开箱即用支持。因为EF没有,所以我的解决方案是在“服务”层处理这个问题(即在控制器/视图模型和DbContext之间)。
我所做的是创建一个抽象,它允许我存储和检索与任何实体相关联的元素(在我的例子中是Notes或Comments)。我通过手动存储被引用对象的实体类型和id来做到这一点。
这很简单,除非您想将元素与非持久实体相关联(我在DbContext中使用一些回调来处理)
https://stackoverflow.com/questions/10935861
复制相似问题