2012-02-09 4 views
3

NHibernateセッションから接続されていないプロキシがあり、2番目のセッションで変更されているかどうかを確認しようとしています。プロセスでは、私は、エンティティがプロキシであるかどうかを確認し、それがある場合は、次の呼び出しを実行します。IPersistenceContext.UnproxyAndReassociateの後にIPersistenceContext.GetEntryがnullを返すのはなぜですか?

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

私はoldEntryがnullではないことをこの時点で期待する、プロキシ以来、基礎となりますエンティティがpersistenceContextに再関連付けされました。ただし、UnproxyAndReassociateは、StatefulPersistenceContext.entityEntriesマップをエンティティに設定しません。

どうしてですか?リアソシエーションは負荷と同じと見なされますか?

答えて

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

プロキシを再関連し、あなたが戻ってunproxiedオブジェクトを取得することと思われます。 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を考慮していません。

関連する問題