当我尝试访问存储在我的域对象的属性中的对象时,我收到此异常。我做了一些研究,但仍然不明白为什么我会收到这个错误。
我有一个非常基本的存储库,我在其中创建会话,然后使用ICriteria查询从结果列表中获取第一条记录。 My Connection域对象具有映射到Server的一对多关系。为什么会话在获取Connection对象时不将服务器作为代理包括在内?我对NHibernate的会话管理不是很熟悉。
这是我的实施:
Domain obj:
public class Connection {
public virtual int Id { get; private set; }
public virtual string FullName { get; set; }
public virtual string Email { get; set; }
public virtual string NickName { get; set; }
public virtual string Alternative { get; set; }
public virtual bool IsInvisible { get; set; }
public virtual Server CurrentServer { get; set; }
}
public Connection GetConnection()
{
using (ISession session = NHibernateHelper.OpenSession())
{
ICriteria crit = session.CreateCriteria(typeof(Connection));
crit.SetMaxResults(1);
IList<Connection> connection = crit.List<Connection>();
return connection[0];
}
}
以上将成功返回Connection对象。但是,通过抛出异常来访问CurrentServer属性。这是我的假设,NHibernate知道这个对象与'CurrentServer'之间的关系,因此在请求时懒洋洋地加载该对象。有人能告诉我哪里被误入歧途吗?
谢谢!
答案 0 :(得分:1)
首先处理会话,然后开始延迟加载。应将对象连接到会话以启用延迟加载。
答案 1 :(得分:1)
由于Jamie Ide的评论,我找到了答案。问题是我在一个using语句中包装我的会话。这意味着当我尝试访问Server属性时,当前会话已经被释放,因此延迟加载无法使用该会话来获取服务器。
答案 2 :(得分:0)
如果是网络应用,请使用每次请求会话模式。如果它是Windows应用程序。这将需要更多的工作。我在Windows窗体的生命周期中保持会话打开并将其处理在FormClosing事件中。这适用于除少数情况之外的所有情况。
我不能为15分做什么? : - )