我从NHibernate会话中获得了断开连接的代理,我试图看看它是否在第二个会话中被修改。在此过程中,我检查实体是否是代理,如果是,请执行以下调用:
var proxy = entity as INHibernateProxy;
var obj = persistenceContext.UnproxyAndReassociate(proxy);
var oldEntry = persistenceContext.GetEntry(obj);
我希望此时oldEntry
不会为空,因为代理和基础实体已与persistenceContext
重新关联。但是,UnproxyAndReassociate
不会使用实体填充StatefulPersistenceContext.entityEntries
地图。
为什么不呢?重新关联是否与负载相同?
答案 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,因此重新关联代理与将基础条目与会话重新关联不同。