C# NHibernate中的合并分离对象图

C# NHibernate中的合并分离对象图,c#,nhibernate,lazy-loading,castle-activerecord,C#,Nhibernate,Lazy Loading,Castle Activerecord,我正在努力解决一个我在Hibernate中从未遇到过的NHibernate问题。我有一个对象,它有一个延迟加载的集合。我在一个会话中加载对象,然后我想在另一个会话中重新连接它,并初始化延迟加载的集合。但是,我不断收到“集合未与会话关联”错误。要合并的代码非常简单: /// <summary> /// Loads all the lazy collections in the sample types /// </summary> /// &

我正在努力解决一个我在Hibernate中从未遇到过的NHibernate问题。我有一个对象,它有一个延迟加载的集合。我在一个会话中加载对象,然后我想在另一个会话中重新连接它,并初始化延迟加载的集合。但是,我不断收到“集合未与会话关联”错误。要合并的代码非常简单:

    /// <summary>
    /// Loads all the lazy collections in the sample types
    /// </summary>
    /// <param name="sampleTypes"></param>
    public static void FullyLoadSampleTypes(ICollection<SampleType> sampleTypes)
    {
        using (SessionScopeWrapper ssw = new SessionScopeWrapper(FlushAction.Never))
        {
            sampleTypes.ForEach(st =>
            {
                if (!NHibernateUtil.IsInitialized(st.MasterKeyValuePairs))
                {
                    ssw.Session.Merge(st);
                    NHibernateUtil.Initialize(st.MasterKeyValuePairs);
                }
            });
        }
    }
//
///加载示例类型中的所有惰性集合
/// 
/// 
公共静态void FullyLoadSampleTypes(ICollection sampleTypes)
{
使用(SessionScopeWrapper ssw=newsessionScopeWrapper(FlushAction.Never))
{
sampleTypes.ForEach(st=>
{
如果(!NHibernateUtil.已初始化(st.MasterKeyValuePairs))
{
ssw.Session.Merge(st);
初始化(st.MasterKeyValuePairs);
}
});
}
}
合并执行,但初始化调用抛出“未与会话错误关联”-注意,我在Hibernate 3上(目前被Activerecord的依赖项锁定)。我原以为合并会重新关联sampleType对象及其集合

谁能帮我解释一下情况吗?请注意,我可以在一个会话中加载整个内容(包括惰性集合),但我需要知道如何重新连接并惰性加载NHibernate的集合

干杯


Neil

Merge
用于将分离的实体对象从第二个会话复制到相应的其他对象中。然后,
Merge
将此对应对象返回到第二个会话中

您分离的对象在以后仍然分离

如果执行以下操作,代码不会崩溃:

if (!NHibernateUtil.IsInitialized(st.MasterKeyValuePairs))
{
    var merged = ssw.Session.Merge(st);
    NHibernateUtil.Initialize(merged.MasterKeyValuePairs);
}
这记录在
Merge
xml注释(我的重点)中

将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,则将加载该实例。返回持久实例。如果给定实例未保存,请保存其副本并将其作为新的持久实例返回给定实例不会与会话关联。

也许这不适合你。如果希望分离的对象与第二个会话关联,则需要在此第二个会话中更新它。诚然,
Update
xml注释对此并不明确。尽管如此,还是要小心(从
):

如果存在具有相同标识符的持久实例,则会引发异常


这意味着,如果您的第二个会话已经加载了相同的实体,
更新将失败。

谢谢;事实上,我发现合并会返回一个对象,这就是合并后的对象,您可以按照编写的那样使用它。更新技巧是值得知道的,但我没有意识到这一点。我现在要做的就是扔掉activerecord并升级到NHibernate4!这不是一个“更新技巧”,即更新用例<附加实体不需要代码>更新
,会话跟踪其更改,会话不需要对其进行任何
更新
调用<代码>更新仅对分离的实体或来自另一个会话的实体有用。