如何在另一个会话中更新具有延迟属性的对象(代理对象)

本文关键字:对象 延迟 属性 代理 另一个 会话 更新 | 更新日期: 2023-09-27 17:50:18

我试图在会话中获取具有惰性属性的对象,并试图在另一个会话中更新它。但它未能做到这一点错误:No persister for SecUserProxy(实际类是SecUser)

我正在使用NHibernate 3.4。当我在谷歌上搜索时,我才知道这是一个已经修复的bug。

我还看到了这篇文章,其中说如果你的代理对象实现了INhibernateProxy,你可以取消代理对象NHibernate。由于NHibernate不再支持可插入的代理工厂(如Castle, LinFu等),它使用了一个内部的, I'm假设内部可能是INhibernateProxy

所以我在新会话中做了以下操作,我想更新我的对象为:

 object unprox_obj = Session
     .GetSessionImplementation()
     .PersistenceContext.Unproxy(secUserobj);

期望获得相同的对象,但使用实际类型i-e SecUser,以便它可以更新而不会出现任何错误。但是它仍然返回一个代理对象。

我不明白发生了什么事?

更新:我刚刚意识到'secUserobj'不是INhibernateProxy。所以我怎么能使它INhibernateProxy为了更新我的对象在另一个会话?

 if (secUserobj is INHibernateProxy)
 {
     unprox_obj = Session
        .GetSessionImplementation()
        .PersistenceContext.Unproxy(secUserobj);
 }

如何在另一个会话中更新具有延迟属性的对象(代理对象)

分离对象(在一个会话中加载,并作为引用保存)可以重新附加。我们可以用session.Merge()session.Lock()

老。更新分离对象

许多应用程序需要在一个事务中检索对象,将其发送到UI层进行操作,然后将更改保存在新事务中....

…最后一种情况可以通过使用 Merge(Object o) 来避免。此方法将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与会话关联的持久实例,它将被加载。该方法返回持久实例。如果给定的实例未保存或不存在于数据库中,NHibernate将保存它并将其作为一个新的持久实例返回。否则,给定的实例不会与会话关联。在大多数具有分离对象的应用程序中,您需要SaveOrUpdate()Merge()这两种方法。

19.1.4。初始化集合和代理


在访问未初始化的集合(或其他代理)之前,您也可以使用 Merge() Lock() 将先前加载的对象附加到新的session上。不,NHibernate不会这样做,当然也不应该自动这样做,因为它会引入特别的事务语义!

因此,我们可以将分离的引用传递给.Merge(),然后使用返回的(全新的)对象引用:
MyEntity reAttached = session.Merge<MyEntity>(detached);

要注意,这应该在触及任何分离集合之前完成(如上所述)。