Почему IPersistenceContext.GetEntry возвращает значение NULL после IPersistenceContext.UnproxyAndReassociate? - PullRequest
3 голосов
/ 09 февраля 2012

У меня отключен прокси-сервер из сеанса NHibernate, и я пытаюсь проверить, изменился ли он во втором сеансе. В процессе я проверяю, является ли объект прокси, и если это так, выполняю следующие вызовы:

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

В этой точке я бы ожидал, что oldEntry не будет нулевым, поскольку прокси и основная сущность были повторно связаны с persistenceContext. Однако UnproxyAndReassociate не заполняет карту StatefulPersistenceContext.entityEntries сущностью.

Почему бы и нет? Разве повторная ассоциация не считается такой же, как нагрузка?

1 Ответ

0 голосов
/ 11 декабря 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...