使用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个节点)。
对于这个问题,你有更好的解决方案吗??谢谢
一个选项是将图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; }
}