Di tanto in tanto ISession
eseguiranno le istruzioni SQL necessarie per sincronizzare lo stato della connessione ADO.NET con lo stato degli oggetti conservati in memoria. Questo processo, flush, si verifica per impostazione predefinita nei seguenti punti
- da alcune invocazioni di
Find()
oEnumerable()
- a partire dal
NHibernate.ITransaction.Commit()
- a partire dal
ISession.Flush()
Le istruzioni SQL vengono emesse nel seguente ordine
- tutti gli inserimenti di entità, nello stesso ordine in cui sono stati salvati gli oggetti corrispondenti
ISession.Save()
- tutti gli aggiornamenti delle entità
- tutte le eliminazioni di raccolte
- tutte le eliminazioni, gli aggiornamenti e gli inserimenti degli elementi di raccolta
- tutti gli inserimenti di raccolta
- tutte le eliminazioni di entità, nello stesso ordine in cui gli oggetti corrispondenti sono stati eliminati usando
ISession.Delete()
(Un'eccezione è che gli oggetti che utilizzano la generazione dell'ID nativo vengono inseriti quando vengono salvati.)
Tranne quando esplicitamente Flush()
, non ci sono assolutamente garanzie su quando la Sessione esegue le chiamate ADO.NET, solo l'ordine in cui vengono eseguite . Tuttavia, NHibernate garantisce che i ISession.Find(..)
metodi non restituiranno mai dati non aggiornati; né restituiranno i dati errati.
È possibile modificare il comportamento predefinito in modo che lo scarico avvenga meno frequentemente. La FlushMode
classe definisce tre diverse modalità: svuota solo al momento del commit (e solo quando ITransaction
viene utilizzata l' API NHibernate ), svuota automaticamente usando la routine spiegata o non svuota mai a meno che non Flush()
sia chiamata esplicitamente. L'ultima modalità è utile per le unità di lavoro a esecuzione prolungata, in cui una ISession
viene mantenuta aperta e disconnessa per lungo tempo.
...
La conclusione di una sessione prevede quattro fasi distinte:
- svuota la sessione
- impegnare la transazione
- chiudi la sessione
- gestire le eccezioni
Lavaggio della sessione
Se ti capita di usare l' ITransaction
API, non devi preoccuparti di questo passaggio. Verrà eseguito in modo implicito quando viene eseguita la transazione. In caso contrario, è necessario chiamare ISession.Flush()
per assicurarsi che tutte le modifiche siano sincronizzate con il database.
Commettere la transazione del database
Se stai usando l'API NHibernate ITransaction, questo appare come:
tx.Commit(); // flush the session and commit the transaction
Se gestisci tu stesso le transazioni ADO.NET, dovresti eseguire manualmente Commit()
la transazione ADO.NET.
sess.Flush();
currentTransaction.Commit();
Se decidi di non eseguire il commit delle modifiche:
tx.Rollback(); // rollback the transaction
o:
currentTransaction.Rollback();
Se si esegue il rollback della transazione, è necessario chiudere immediatamente ed eliminare la sessione corrente per assicurarsi che lo stato interno di NHibernate sia coerente.
Chiusura della sessione
Una chiamata per ISession.Close()
segnare la fine di una sessione. La principale implicazione di Close () è che la connessione ADO.NET verrà abbandonata dalla sessione.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Se hai fornito la tua connessione, Close()
restituisce un riferimento ad essa, in modo da poterla chiudere manualmente o restituirla al pool. Altrimenti lo Close()
restituisce al pool.