使用 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; }
}
所以我有一个图形对象,如下所示:
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; }
}