使用无状态会话延迟查找字典值

时间:2011-01-23 23:27:38

标签: c# nhibernate hibernate lazy-initialization stateless-session

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

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]

2 个答案:

答案 0 :(得分:0)

您应该使用ISession而不是IStatelessSession,因为使用无状态会话执行的操作不会级联到关联的实例,并且无状态会话会忽略集合。

答案 1 :(得分:0)

无状态会话不支持延迟加载,正是因为它们无状态:它们不跟踪任何关于使用它们检索的实体。

使其成功的唯一方法是急切加载该集合。但是,为什么你想要使用无状态会话,如果他们显然没有提供你需要的东西呢?