Если вы посмотрите на реализацию 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, поэтому повторная привязка прокси-сервера - это не то же самое, что повторная привязка базовой записи к сеансу.