asp.net-mvc – NHibernate – 懒惰地初始化一个角色集合

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – NHibernate – 懒惰地初始化一个角色集合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下看似简单的场景,但是我仍然很喜欢NHibernate。

在我的控制器上尝试加载编辑操作的以下模型时:

控制器编辑操作:

  1. public ActionResult Edit(Guid id)
  2. {
  3. return View(_repository.GetById(id));
  4. }

库:

  1. public SomeModel GetById(Guid id)
  2. {
  3. using (ISession session = NHibernateSessionManager.Instance.GetSession())
  4. return session.Get<SomeModel >(id);
  5. }

模型:

  1. public class SomeModel
  2. {
  3. public virtual string Content { get; set; }
  4. public virtual IList<SomeOtherModel> SomeOtherModel { get; set; }
  5. }

我收到以下错误

– 以懒惰的方式初始化一个角色集合:SomeOtherModel,没有会话或会话被关闭

我在这里缺少什么?

解决方法

问题是您创建并关闭会话中您的模型GetById方法。 (使用语句关闭会话)会话在整个业务交易中必须可用。

有几种方法可以实现这一点。您可以将NHibernate配置为使用会话工厂GetCurrentSession方法。见this post on NHForgethis post on Code Project

  1. public SomeModel GetById(Guid id)
  2. {
  3. // no using keyword here,take the session from the manager which
  4. // manages it as configured
  5. ISession session = NHibernateSessionManager.Instance.GetSession();
  6. return session.Get<SomeModel >(id);
  7. }

我不用这个我写了自己的交易服务,允许以下内容

  1. using (TransactionService.CreateTransactionScope())
  2. {
  3. // same session is used by any repository
  4. var entity = xyRepository.Get(id);
  5.  
  6. // session still there and allows lazy loading
  7. entity.Roles.Add(new Role());
  8.  
  9. // all changes made in memory a flushed to the db
  10. TransactionService.Commit();
  11. }

但是,您实现它,只要业务事务(或系统功能),会话和事务应该生活。除非你不能依赖于事务隔离或者回滚整个事情。

猜你在找的asp.Net相关文章