为什么IPersistenceContext.GetEntry在IPersistenceContext.UnproxyAndReassociate之后返回null?

时间:2012-02-09 01:07:24

标签: c# .net nhibernate

我从NHibernate会话中获得了断开连接的代理,我试图看看它是否在第二个会话中被修改。在此过程中,我检查实体是否是代理,如果是,请执行以下调用:

 var proxy = entity as INHibernateProxy;
 var obj = persistenceContext.UnproxyAndReassociate(proxy);
 var oldEntry = persistenceContext.GetEntry(obj);

我希望此时oldEntry不会为空,因为代理和基础实体已与persistenceContext重新关联。但是,UnproxyAndReassociate不会使用实体填充StatefulPersistenceContext.entityEntries地图。

为什么不呢?重新关联是否与负载相同?

1 个答案:

答案 0 :(得分:0)

如果你看一下UnproxyAndReassociate的实现:

public object UnproxyAndReassociate(object maybeProxy)
{
    var proxy = maybeProxy as INHibernateProxy;
    if (proxy != null)
    {
        ILazyInitializer li = proxy.HibernateLazyInitializer;
        ReassociateProxy(li, proxy);
        return li.GetImplementation(); //initialize + unwrap the object 
    }
    return maybeProxy;
}

它似乎重新关联了代理,并且您获得了未经过代理的对象。 ReassociateProxy确实:

private void ReassociateProxy(ILazyInitializer li, INHibernateProxy proxy)
{
    if (li.Session != Session)
    {
        IEntityPersister persister = session.Factory.GetEntityPersister(li.EntityName);
        EntityKey key = new EntityKey(li.Identifier, persister, session.EntityMode);
        // any earlier proxy takes precedence
        if (!proxiesByKey.ContainsKey(key))
        {
            proxiesByKey[key] = proxy;
        }
        proxy.HibernateLazyInitializer.Session = Session;
    }
}

因此它存储在字典proxiesByKey中。

public EntityEntry GetEntry(object entity)
{
    return (EntityEntry)entityEntries[entity];
}

GetEntry甚至不考虑proxiesByKey,因此重新关联代理与将基础条目与会话重新关联不同。