NHibernate:从分离的实体初始化一个统一的集合,不可能吗?

NHibernate:从分离的实体初始化一个统一的集合,不可能吗?,nhibernate,lazy-loading,Nhibernate,Lazy Loading,例如: public class ParentObj { public virtual int Id { get; set; } public virtual IList<ChildObj> ChildCollection { get; set; } //Lazy loaded } 错误消息:集合未与任何会话关联 我做错了什么?在这种情况下,初始化ChildCollection的唯一方法是再次调用Get()吗?根据 如果存在具有当前与会话关联的相同标识符的持久实例

例如:

public class ParentObj
{
    public virtual int Id { get; set; }
    public virtual IList<ChildObj> ChildCollection { get; set; } //Lazy loaded
}
错误消息:集合未与任何会话关联


我做错了什么?在这种情况下,初始化ChildCollection的唯一方法是再次调用Get()吗?

根据

  • 如果存在具有当前与会话关联的相同标识符的持久实例,请复制给定会话的状态 对象添加到持久实例上
  • 如果当前没有与会话关联的持久实例,请尝试从数据库加载它,或创建新的持久实例 实例
  • 将返回持久实例
  • 给定实例不会与会话关联,它将保持分离状态
我从未尝试过这一点,但如果您尝试:-

using (var tx = session.BeginTransaction())
{
    var dbObj = session.Merge(parentObj);
    //do something with dbObj.Childcollection
}

似乎调用了一个
select
,正是该对象用于将已断开连接的对象合并到中。因此,您需要在以后使用此对象进行延迟加载等(代理)

根据

  • 如果存在具有当前与会话关联的相同标识符的持久实例,请复制给定会话的状态 对象添加到持久实例上
  • 如果当前没有与会话关联的持久实例,请尝试从数据库加载它,或创建新的持久实例 实例
  • 将返回持久实例
  • 给定实例不会与会话关联,它将保持分离状态
我从未尝试过这一点,但如果您尝试:-

using (var tx = session.BeginTransaction())
{
    var dbObj = session.Merge(parentObj);
    //do something with dbObj.Childcollection
}

似乎调用了一个
select
,正是该对象用于将已断开连接的对象合并到中。因此,在延迟加载等(代理)之后,您需要使用这个对象。

我也遇到了同样的问题。我将merge更改为SaveorUpdate

因此,您的代码将是:

using (var session = GetSesion())
using (var tx = session.BeginTransaction())
{
    parentOjb = session.SaveorUpdate(parentObj);
    NHibernateUtil.Initialize(parentObj.ChildCollection); 
}

我也遇到了同样的问题。我将“合并”更改为“保存或更新”

因此,您的代码将是:

using (var session = GetSesion())
using (var tx = session.BeginTransaction())
{
    parentOjb = session.SaveorUpdate(parentObj);
    NHibernateUtil.Initialize(parentObj.ChildCollection); 
}

您确定合并调用中发生了错误吗?或者下面的行?很抱歉,您是对的,调用Initialize()时会抛出错误消息。我已经更新了原来的帖子。谢谢。您确定合并呼叫发生错误吗?或者下面的行?很抱歉,您是对的,调用Initialize()时会抛出错误消息。我已经更新了原来的帖子。谢谢你。我有同样的逻辑,所以我发布的代码应该是有效的,问题在我代码的其他地方,感谢你的评论,尽管我查看了一些代码并发现了问题。有时候,只是需要别人打开你脑袋里的灯泡。谢谢别担心。很高兴我最终帮了忙。我有同样的逻辑,所以我发布的代码应该可以工作,问题在我代码的其他地方,感谢你的评论,尽管我查看了一些代码并发现了问题。有时候,只是需要别人打开你脑袋里的灯泡。谢谢别担心。很高兴我最终帮忙了。