在我的应用程序中,我设置了三元字典映射,以便对于给定的用户,我可以检索属于该用户的对象的每个实例的“设置”。也就是说,我有类似的东西:

public class User
{
    public virtual IDictionary<Baz, BazSettings> BazSettings { get; set; }

    //...


因此,只要有Baz对象,就可以通过currentUser.BazSettings[baz]查找当前用户的baz设置。

我希望能够使用无状态会话来执行此操作,但是使用以下代码会得到一个LazyInitializationException

//int bazId;
using (IStatelessSession session = Global.SessionFactory.OpenStatelessSession())
{
    var currentUser = session.Get<User>(Membership.GetUser().ProviderUserKey);
    var baz = session.Get<Baz>(bazId);
    var bazSettings = currentUser.BazSettings[baz]; // raises `LazyInitializationException`


当我改用ISession时,问题就消失了。

完整的NHibernate错误消息包括文本“没有会话或会话已关闭”。这是有道理的,因为在使用无状态会话时,实体未连接到该会话。但是,我认为有一种方法可以使用无状态会话来执行此查找。

如何使用无状态会话执行查找currentUser.BazSettings[baz]

最佳答案

无状态会话不支持延迟加载,恰恰是因为它们是无状态的:它们不跟踪有关与它们一起检索的实体的任何信息。

使它起作用的唯一方法是急于加载集合。但是,如果它们显然不能满足您的需求,那么为什么要使用无状态会话呢?

09-25 22:01