2010-04-23 13 views
6

La domanda segue dal Fluent NHibernate + multiple databases (non c'è bisogno di seguire questo link, ci dovrebbe essere abbastanza sfondo qui).Come identificare la Session Factory di un'entità particolare con NHibernate fluente e più database

mio problema è questo:

sto utilizzando Fluent NHibernate. La mia applicazione utilizza più database. Ogni database ha le sue entità registrate (mappate) contro di esso. Il risultato è che hanno più Session Factories, ognuna relativa a un singolo DB, e ciascuna "contenente" il proprio insieme di entità mappate.

Per le entità di caricamento, ho creato una classe Factory generica che fornisce alcuni metodi di caricamento standard utilizzabili per qualsiasi entità registrata (in qualsiasi DB). Il problema è: i metodi di caricamento devono utilizzare la factory di sessione corretta per la classe di entità con cui sono occupato. Come dovrei determinare quale factory di sessione devo usare? Ho tutte le fabbriche di Session 'a portata di mano' (e indicizzate dal nome del database), ho solo bisogno di un modo, conoscendo solo il tipo di Entità che sto per caricare, di scegliere la giusta Session Factory da usare.

Ad esempio:

public IBaseBusinessObject CreatePopulatedInstance(Type boType, Guid instanceKey) 
{ 
    IBaseBusinessObject result = null; 
    ISessionFactory sessionFactory = GetSessionFactory(boType); 
    using (ISession session = sessionFactory.OpenSession()) 
    { 
    using (session.BeginTransaction()) 
    { 
     result = (IBaseBusinessObject)session.Get(boType, instanceKey); 
    } 
    } 
    return result; 
} 

Che ha bisogno di andare avanti in GetSessionFactory (boType)?

Grazie per la lettura!

risposta

3

Vorrei iniziare guardando il metodo ISessionFactory.GetClassMetaData.

IClassMetadata metadata = sessionfactory.GetClassMetadata(boType); 

Se si riesce a mantenere un elenco di istanze ISessionFactory, è possibile enumerare la strada attraverso di loro fino a trovare quella che ha i metadati per il vostro tipo boType.

Non l'ho mai usato e non ho i miei riferimenti a portata di mano, ma mi aspetterei che restituisca null o sollevi un'eccezione se non riconosce il tipo. Se ottieni un valore per i metadati senza errori, allora questo è il tuo factory di sessione.

Buona fortuna

Neil.

+0

Grazie mille. Questa soluzione ha funzionato. – Trevor

+0

Il metodo GetClassMetadata() restituisce null se il tipo specificato non è gestito dalla Session Factory in questione. – Trevor

+0

Prego. –

Problemi correlati