3 Stimmen

Warum gibt IPersistenceContext.GetEntry nach IPersistenceContext.UnproxyAndReassociate null zurück?

Ich habe einen getrennten Proxy aus einer NHibernate-Sitzung und versuche zu sehen, ob er in einer zweiten Sitzung geändert wurde. Dabei überprüfe ich, ob die Entität ein Proxy ist, und wenn ja, führe ich die folgenden Aufrufe durch:

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

Ich würde erwarten, dass zu diesem Zeitpunkt der oldEntry nicht null ist, da der Proxy und die zugrunde liegende Entität mit dem persistenceContext neu assoziiert wurden. Allerdings füllt UnproxyAndReassociate die StatefulPersistenceContext.entityEntries Karte nicht mit der Entität auf.

Warum nicht? Wird die Neuzuordnung nicht als ein Laden betrachtet?

0voto

Jeroen Punkte 163

Wenn Sie sich die Implementierung von UnproxyAndReassociate ansehen:

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;
}

scheint es, dass es das Proxy neu verknüpft und dass Sie das unproxierte Objekt zurückbekommen. ReassociateProxy tut dies:

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;
    }
}

Es wird also im Wörterbuch proxiesByKey gespeichert.

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

GetEntry berücksichtigt nicht einmal die proxiesByKey, sodass das Neuverknüpfen eines Proxys nicht dasselbe ist wie das Neuverknüpfen des zugrunde liegenden Eintrags mit einer Sitzung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X