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

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

public class User { public virtual IDictionary BazSettings { get; set; } //... 

所以每当我有一个Baz对象时,我都可以通过currentUser.BazSettings[baz]查找当前用户的baz设置。

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

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

当我使用ISession ,问题就会消失。

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

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

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

使其工作的唯一方法是急切加载集合。 但是,如果他们显然没有提供您需要的内容,为什么还要使用无状态会话?

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