我想在会话结束后加载一个对象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
}
答案 0 :(得分:2)
我们可以从NHibernate原生支持中获益,以便使用分离的对象
...
在访问未初始化的集合之前,您还可以使用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
...只是一个想法......