2011-03-22 48 views
1

我收到这个错误,想知道是否有人有任何想法如何调试。Nhibernate - 未能初始化一个集合...没有会话或会话被关闭

由于

初始化[GL.Objects.Profile`1 [[GL.Objects.Education.Education, GL.Objects,版本= 0.1.1.0, 文化=中性 公钥= ebf25c7be4be0c91 ]]#289289]

-failed懒洋洋地初始化角色的集合:

GL.Objects.Profile`1 [GL.Objects.Education.Education, GL.Objects,版本= 0.1.1.0 , 文化=中性, 公钥= ebf25c7be4be0c91]。Profilables,

没有会话或会话已关闭”

启动会话

 var watsonService = new WatsonService(); 

这段代码保存实例化的对象。

watsonService.SaveEducation(e); 
    epf1.Profilables.Add(e); 
    watsonService.SaveEducationProfile(epf1); 
    epf2 = watsonService.GetEducationProfile(epf1.ID.Value); 

第一断言通过就好了。 epf2有一个id并被实例化。

 Assert.AreEqual(epf1.ID, epf2.ID); 

此断言失败。 Profileables匹配一个组合表,这个ID被插入成功。但是现在,当我尝试访问集合中的第一个元素时,它失败了。

 Assert.AreEqual(epf1.Profilables[0].ID, epf2.Profilables[0].ID); 

这是得到年代由GetEducationProfile方法调用的方法实现。

public T Get<T>(int id) where T : IDataObject 
{ 
    return (T)_session.Load(typeof(T), id, LockMode.Read); 
} 

这是在流利的映射文件的构造函数的定义。

public EducationProfileMap() 
    { 
     Table("Profile"); 
     Id(x => x.ID) 
     .Column("ProfileID") 
     .GeneratedBy 
     .HiLo(FluentConst.HILO_TABLE, 
       FluentConst.NEXTHI_COLUMN, 
       FluentConst.MAXLO, 
       String.Format(FluentConst.WHERE_FMT_STR, "Profile")); 

     Map(x => x.Type).CustomType<int>().Column("ProfileType"); 

     HasManyToMany(x => x.Profilables) 
        .ParentKeyColumn("ProfileID") 
        .ChildKeyColumn("EducationID") 
        .Cascade.All() 
        .Table("EducationProfile"); 
    } 
+0

会话管理可能是NHibernate的一大痛苦。延迟加载使得它更加复杂。 – 2011-03-23 22:56:59

回答

1

我的道歉没有给予更多的相关信息的问题。 问题来自于如何管理会话。

我的测试实例下面的类:

public WatsonAdaptor(string user) 
    { 
     if (DataSession == null) 
     DataSession = new HibernateSession(
         HibernateFactoryManager.HibernateFactory.Watson, user); 
    } 

以下方法由SaveEducation方法

public int? SaveEducation(Education e) { 
     try 
     { 
      var watson = new WatsonAdaptor("ealite"); 
      watson.Save(e); 
      return e.ID; 
     } 
     catch (Exception ex) 

打开一个会议的要求。

在返回时会话被抛弃,所以懒惰的加载不会发生。

我需要做的是确保在会话仍处于打开状态时发生延迟加载。

相关问题