如何在nhibernate中加载包含任何映射的复杂图

如何在nhibernate中加载包含任何映射的复杂图,nhibernate,any,Nhibernate,Any,所以,我有一个大的图表,它是用几个不同的any关系连接在一起的,我试图弄清楚如何急切地加载整个图表 我有一个有步骤的向导。该步骤可以直接链接到另一个步骤,也可以链接到某个中间操作,然后再链接到另一个步骤。步骤可以链接到层次结构中的任何位置的其他步骤;我不想加载潜在递归步骤的子级。我用一个IsLink bool标记了它们。有几种不同类型的步骤,因此任何与步骤链接的地方都是Any映射。大型图会导致许多数据库点击以加载整个层次结构 从我能想到的最简单的事情开始: _session.Qu

所以,我有一个大的图表,它是用几个不同的any关系连接在一起的,我试图弄清楚如何急切地加载整个图表

我有一个有步骤的向导。该步骤可以直接链接到另一个步骤,也可以链接到某个中间操作,然后再链接到另一个步骤。步骤可以链接到层次结构中的任何位置的其他步骤;我不想加载潜在递归步骤的子级。我用一个IsLink bool标记了它们。有几种不同类型的步骤,因此任何与步骤链接的地方都是Any映射。大型图会导致许多数据库点击以加载整个层次结构

从我能想到的最简单的事情开始:

        _session.QueryOver<Wizard>()
                .Where(w => w.Id == wizardId)
                .Fetch(w => w.Step).Eager
                .List().First();
\u session.QueryOver()
.Where(w=>w.Id==wizardId)
.Fetch(w=>w.Step).Eager
.List().First();
导致错误:“任何类型都没有唯一的引用持久器”

我不太确定从这里到哪里去把这整件东西装好。我更愿意使用NHibernate来完成它,而不是生成一些大型存储过程。等级制度起作用;我可以递归遍历并构建我想要的一切,但这不是很好


我从哪里开始?

您不能在一次往返中获取异构关联(即
任何
)。此外,如果您有递归/层次关系,这也不会有多大帮助


这里有两种技术可以帮助您提高性能:和。

是否可以批量处理这些技术?问题的关键似乎是在抓住之前的记录之前不知道下一个记录是什么。我想我希望能有一个神奇的办法来抓取一棵从X根开始的树,用一个过滤器来防止递归(我注意到数据库中哪些记录可能是递归的)。我想在缓存就位后,我必须对此进行调查。谢谢没有神奇的子弹。递归SQL是非标准的,所以NH中不支持它。但是您总是可以编写一个递归SqlQuery并从中获取实体。或者,您可以重新考虑层次结构:将所有步骤链接到向导,作为一个简单的集合如何?在这一点上,它远不止是一个简单的向导;这是一个相当复杂的逻辑图,包含跨越任何单个组边界的链接。您是建议尝试使用存储过程将记录加载到NH中,还是建议直接将其加载到我返回的视图模型对象中更好?我不需要做任何事情,除了展示它们;非常值得报道。