使用无状态会话的词典值的懒惰查找
-
23-10-2019 - |
题
在我的应用程序中,我设置了一个三元字典映射,以便对于给定的用户,我可以为属于用户的对象的每个实例检索“设置”。也就是说,我有类似的东西:
public class User
{
public virtual IDictionary<Baz, BazSettings> BazSettings { get; set; }
//...
所以每当我有一个 Baz
对象,我可以通过 currentUser.BazSettings[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错误消息包括文本“ No会议或会话已关闭”。这是有道理的,因为在使用无状态会话时,实体未连接到会话。但是,我认为有一种使用无状态会话来执行此查找的方法。
我如何使用无状态会话执行查找 currentUser.BazSettings[baz]
?
解决方案
无状态会议不支持懒惰的负载,正是因为它们是 无状态: :他们不追踪 任何事物 关于与他们一起检索的实体。
使其正常工作的唯一方法是渴望加载该系列。但是你为什么要 想 使用无状态会议,如果他们显然不提供您需要的内容?
其他提示
您应该使用Isession而不是IstatelessSession,因为使用无状态会话执行的操作不会级联到关联的实例,而无状态会话则忽略了收集。
不隶属于 StackOverflow