Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF-CF中有向图的建模_C#_.net_Entity Framework_Graph_Ef Code First - Fatal编程技术网

C# EF-CF中有向图的建模

C# EF-CF中有向图的建模,c#,.net,entity-framework,graph,ef-code-first,C#,.net,Entity Framework,Graph,Ef Code First,我在使用EF代码对图形结构进行建模时遇到了一些问题。我的应用程序中的许多具体对象可以是与多种边缘类型中的任何一种相关的节点 例如,两个用户对象可能有一种关系(like、dislike、related to),但每一个都可以与另一种类型的对象同等关联(“查看”页面、“喜欢”消息等) 为了在应用程序中对此进行建模,我使用了一个GraphNode基类,所有可能的节点都将从中继承,每个GraphNode都有一个边集合。每条边都有一个SourceNode、一个DestinationNode和一个Relat

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

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

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

我知道如何将其建模为一个直接的数据库优先开发,使用一个Edge表,其中包含一个代理键、SourceObjectID和DestinationObjectID字段(即链接对象的PK)、SourceObjectType和DestinationObjectType字段(即相关对象的类型),但该网站要求EF代码首先实现

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


有人这样做过吗,或者有人能为我指出一个正确的方向来做这件事吗

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

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

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


这通常很简单,除非您想将元素与一个尚未持久化的实体相关联(我在DbContext中使用一些回调来处理它)

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

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

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


这基本上是微不足道的,除非您想将元素与一个尚未持久化的实体相关联(我在DbContext中使用一些回调来处理这个问题)

听起来就像我最后所做的那样。它可能不像我希望的那样优雅,但我知道这是一种行之有效的模式。我将选择一种无节点版本,因此我的EF实体只是边缘,具有SourceID、SourceType、DestinationID、DestinationType和RelationshipType,正如您所建议的,我必须根据指定类型和Id的select来处理数据库之外的关系。听起来和我最后做的差不多。它可能不像我希望的那样优雅,但我知道这是一种行之有效的模式。我将选择一种无节点的版本,因此我的EF实体只是边缘,具有SourceID、SourceType、DestinationID、DestinationType和RelationshipType,正如您所建议的,我必须根据指定类型和Id的选择来处理远离数据库的关系。