0

问题是获取所有孩子年龄都在一定年龄以上的所有父母。预期的输出还应该包括他们父母的孩子列表。

我有以下...

session.CreateQuery("select p, c from Parent as p left outer join p.Children as c where c.Age!= :age")
 .SetParameter("age", somevalue);

但我收到以下错误:

Initializing[ns.Parent #18]-failed to lazily initialize a collection
of role: ns.Children, no session or session was closed

这是我的代码:

class Parent {
   public virtual int Id { get; set; }
   public virtual IList<Child> Children { get; set; }
}


class Child {
   public virtual int Id { get; set; }
   public virtual int Age{ get; set; }
   public virtual int ParentId { get; set; }   
}

  //the mapping

  public class ParentMap : ClassMap<Parent>
    {
        public ParentMap()
        {
            this.Id(t => t.Id);         
            this.HasMany(t => t.Child).Not.LazyLoad();
        }
    }

    class ParentRepository : IParentRepository {

        public IEnumerable<Parent> GetAll()
        {

                using (var session = _factory.OpenSession())
                {
                    session.CreateQuery("select p, c from Parent as p left outer join       p.Children as c where c.Age!= :age")
                    .SetParameter("age", somevalue);

                    return result.Distinct().ToArray();
                }

        }
    }

//In a different class I call GetAll.
var data = parentRepository.GetAll();
//at the following line that i get the error. 
    IEnumerable<Contracts.Parent> parents = Mapper.Map<IEnumerable<ns.Parent>,        IEnumerable<Contracts.Parent>>(data.ToArray());

我使用 AutoMapper 将对象映射到另一个类似的对象(父母和孩子)。Contract命名空间中的Parent和Child具有完全相同类型的属性

4

1 回答 1

0

NHibernate 和它ISession确实需要一种不同的方法然后using声明(通常)。我们更喜欢的是让session- 尽可能晚地打开(例如,甚至一些懒惰的技术)并尽可能长时间地保持打开(如果打开) 。

对于 Web 应用程序,最常见的方法是(请参阅Web 应用程序的有效 NHibernate 会话管理

  • 使用 BeginRequest/EndRequest 打开/关闭会话。使用 AOP – 属性处理事务。我不确定,但我认为城堡的 AutoTransaction 设施就是这种情况。
  • 使用 Asp.Net MVC ActionFilters 打开/关闭会话和事务。

如果您在 Web 环境中,请检查以下示例:session-per-web-global.cs。该代码的片段:

public static ISessionFactory SessionFactory { get; private set; }
protected void Application_Start()
{
    ...     
    //Configure NHibernate and create a session factory for the application
    var nhibernateConiguration = new NHibernate.Cfg.Configuration();
    nhibernateConiguration.Configure();
    SessionFactory = nhibernateConiguration.BuildSessionFactory();
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
    //Create NHibernate session for this request and bind it to the
    //NHibernate session context (configured as web context using HttpContext)
    var session = SessionFactory.OpenSession();
    NHibernate.Context.CurrentSessionContext.Bind(session);
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    //Detach the session from this web request
    var session = NHibernate.Context.CurrentSessionContext.Unbind(SessionFactory);
    session.Dispose();
}

即使不在网络请求场景中,尝试找出一些如何处理 ISession 的方法,并在更多操作中保持开放......检查:

使用 NHibernate 构建桌面待办事项应用程序

于 2014-03-13T06:23:07.050 回答