会话结束后加载子对象

时间:2015-05-11 14:17:06

标签: c# nhibernate fluent-nhibernate lazy-loading

我想在会话结束后加载一个对象sub,无论如何要做到这一点?

using (var session = NHibernateHelper<T>.OpenSession())
{
    Foo = session.CreateCriteria(Foo).List<Foo>();
}

using (var session = NHibernateHelper<T>.OpenSession())
{
     Foo.Children.Load();
}


public static void Load<T>(this IList<T> list)
{
     //load foo with Children
}

1 个答案:

答案 0 :(得分:2)

我们可以从NHibernate原生支持中获益,以便使用分离的对象

19.1.4. Initializing collections and proxies

  

...
  在访问未初始化的集合之前,您还可以使用 Merge() Lock() 将以前加载的对象附加到新的ISession(或其他代理人)。不,NHibernate没有,当然不应该自动执行此操作,因为它会引入临时事务语义!   ...

调整后的加载()方法如下所示:

public static TEntity LoadCollection<TEntity, TItem>(
        this TEntity entity, 
        Func<TEntity, IList<TItem>> listGetter)
    where TEntity : class
{
    using (var session = NHibernateHelper<T>.OpenSession())
    {
        // here we get brand new - connected - instance of TEntity
        TEntity reAttached = session.Merge<TEntity>(entity);

        NHibernate.NHibernateUtil
            .Initialize(listGetter.Invoke(reAttached));

        return reAttached;
    }
}

和主叫方:

using (var session = NHibernateHelper<T>.OpenSession())
{
    IList<Foo> foos = session.CreateCriteria<Foo>()
            ...
            .List<Contact>();
}

Foo foo = foos.First();

// here we get merged instance with initiated
foo =  foo.LoadCollection(f => f.SomeCollection);

注意:这实际上取决于我们为什么需要它。合并将需要更改引用(旧的分离对象将丢失) 有时可能足够(甚至更好)直接通过会话将集合加载为IList<TItem>,使用Where ParentId = current.ID ...只是一个想法......