使用 Fluent Nhibernate 从我的 sql 数据库中获取图形对象

Fetching a graph object from my sql DB using Fluent Nhibernate

所以我有一个图形对象,如下所示:

public class Graph
{
    ....
    public virtual Node RootNode {get;set;}
}

public class Node
{
    ....
    public virtual IList<Link> Links { get; set; }
}

public class Link
{
    ....
    public virtual Node SourceNode { get; set; }
    public virtual Node TargetNode { get; set; }
}

我正在使用 Fluent Nhibernate 映射实体。非常简单:

Graph中:References(x => x.RootNode, "root_node").Not.LazyLoad()

Node 中:HasMany(x => x.Nodes).Table("nodes") .KeyColumn("graph_id").Not.LazyLoad().Inverse()

Link 中:References(x => x.TargetNode, "target_node_id ").Not.LazyLoad()References(x => x.SourceNode, "source_node_id")

*注意:我希望加载不是惰性的,因为无论如何我都会向客户端发送整个对象。

使用 Nhiberante Profiler 我检查了当我写 session.Get<Graph>(id) 时会发生什么。

问题是它select来自数据库的对象(mysql)一个一个. (select 是图形,然后是根节点,然后是 link,然后是目标等等...)

我想要的 用于 Nhibernate select 图形、所有节点、所有 link(仅 3 个查询)。

我试过的 就是在Graph中添加public virtual IList<Node> Nodes { get; set; }而不是RootNode,并在Node中添加public virtual bool IsRoot { get; set; } 它似乎工作 但我不喜欢 IsRoot 属性 因为我想让图表知道哪个节点是根节点。它也可能导致错误(2 个节点 IsRoot = true)。

对于这个问题,你有更好的解决方案吗?? 谢谢。

一种选择是将图形 ID 存储在节点中,并加载图形的所有节点。全部加载后,它将使用缓存获取子节点,而不是执行 SQL 语句。

public class Graph
{
    ....
    public virtual Node RootNode {get;set;}
}

public class Node
{
    ....
    public virtual Graph Graph {get;set;}
    public virtual IList<Link> Links { get; set; }
}

public class Link
{
    ....
    public virtual Node SourceNode { get; set; }
    public virtual Node TargetNode { get; set; }
}