Nhibernate - 未能初始化集合......没有会话或会话被关闭

时间:2011-03-22 16:10:54

标签: fluent-nhibernate

我收到此错误,我想知道是否有人知道如何调试此错误。

由于

  

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

     

- 懒得初始化角色集合:

     

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);
}
  

这是Fluent Mapping文件中构造函数的定义。

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");
    }

1 个答案:

答案 0 :(得分: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)
  

这会打开一个会话。

在返回时,会话被丢弃,因此不会发生延迟加载。

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