在 NHibernate 中合并分离对象图

Merge Detached Object Graph in NHibernate

我正在努力解决一个在 Hibernate 中从未遇到过的 NHibernate 问题。我有一个带有延迟加载集合的对象。我在一个会话中加载对象,然后我想在另一个会话中重新附加它并初始化延迟加载的集合。但是我不断收到 'collection is not associated with a session' 错误。合并的代码非常简单:

    /// <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);
                }
            });
        }
    }

合并执行但 Initialize 调用抛出 'not associated with a session error' - 请注意,我使用的是 Hibernate 3(目前由于对 Activerecord 的依赖而被锁定)。我本以为 Merge 会重新关联 sampleType 对象及其集合?

任何人都可以为我说明一下情况吗?请注意,我可以在一个会话中加载整个内容(包括惰性集合),但我需要知道如何重新附加和延迟加载 NHibernate 的集合。

干杯,

尼尔

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

返回第二个会话中的相应对象

你的分离对象之后仍然是分离的。

如果您这样做,您的代码将不会崩溃:

if (!NHibernateUtil.IsInitialized(st.MasterKeyValuePairs))
{
    var merged = ssw.Session.Merge(st);
    NHibernateUtil.Initialize(merged.MasterKeyValuePairs);
}

这在 Merge xml 评论(强调我的)中有记录。

Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session.

也许这不适合你。如果您希望您的分离对象与第二个会话相关联,您需要在第二个会话中 Update 它。当然,Update xml 评论对此并不明确。不过要小心(来自<remarks>):

If there is a persistent instance with the same identifier, an exception is thrown.

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