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

本文关键字:一个 对象 图形 获取 Nhibernate Fluent 我的 数据库 sql 使用 | 更新日期: 2023-09-27 18:26:47

所以我有一个图形对象,看起来像这样:

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")

*注意:我希望加载不懒惰,因为我无论如何都要将整个对象发送到客户端。

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

问题是它从DB(mysql)中逐个选择对象。(选择图形,然后是根节点,然后是链接,然后是目标,依此类推…)

我想要什么用于Nhibernate选择图形、所有节点和所有链接(仅3个查询)。

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

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

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

一个选项是将图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; }
}