Час від часу ISessionбуде виконуватися оператори SQL, необхідні для синхронізації стану з'єднання ADO.NET зі станом об'єктів, що зберігаються в пам'яті. Цей процес, змивання, відбувається за замовчуванням у наступних пунктах
- від деяких викликів
Find()абоEnumerable()
- з
NHibernate.ITransaction.Commit()
- з
ISession.Flush()
Виписки SQL видаються в наступному порядку
- всі вставлення сутності, в тому ж порядку, відповідні об'єкти були збережені за допомогою
ISession.Save()
- всі оновлення сутності
- всі видалення колекції
- видалення, оновлення та вставки всіх елементів колекції
- всі вставки колекції
- всі видалення сутності, у тому самому порядку відповідні об'єкти були видалені за допомогою
ISession.Delete()
(Винятком є те, що об'єкти, які використовують нативний ID генерації, вставляються під час їх збереження.)
За винятком випадків експліцитності Flush(), немає абсолютно ніяких гарантій щодо того, коли сесія виконує виклики ADO.NET, лише порядок їх виконання . Однак NHibernate гарантує, що ISession.Find(..)методи ніколи не повернуть несвіжі дані; і вони не повернуть неправильні дані.
Можна змінити поведінку за замовчуванням так, щоб вимивання виникало рідше. FlushModeКлас визначає три різних режиму: тільки на одному рівні під час фіксації (і тільки тоді , коли NHibernate ITransactionвикористовується API), флеш автоматично з допомогою пояснюється рутина, або ніколи не врівень , якщо Flush()не викликається явно. Останній режим корисний для довготривалих одиниць роботи, де ISessionтривалий час тримається відкритим і відключеним.
...
Закінчення сеансу включає чотири різних етапи:
- промити сеанс
- здійснити транзакцію
- закрити сесію
- обробляти винятки
Промивання сесії
Якщо ви користуєтесь ITransactionAPI, вам не потрібно турбуватися про цей крок. Він буде виконуватися неявно, коли транзакція здійснена. В іншому випадку вам слід зателефонувати, ISession.Flush()щоб переконатися, що всі зміни синхронізовані з базою даних.
Здійснення транзакції з базою даних
Якщо ви використовуєте програмний інтерфейс ITi-відповіді NHibernate, це виглядає так:
tx.Commit(); // flush the session and commit the transaction
Якщо ви керуєте операціями ADO.NET самостійно, вам слід вручну здійснити Commit()транзакцію ADO.NET.
sess.Flush();
currentTransaction.Commit();
Якщо ви вирішите не вносити зміни:
tx.Rollback(); // rollback the transaction
або:
currentTransaction.Rollback();
Якщо ви відкажете транзакцію, вам слід негайно закрити та відмовитися від поточного сеансу, щоб забезпечити відповідність внутрішнього стану NHibernate.
Закриття ІСесії
Дзвінок для ISession.Close()позначення кінця сеансу. Основним наслідком Close () є те, що з'єднання ADO.NET буде відмовлено сеансом.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Якщо ви надали власне з'єднання, Close()повертаєте посилання на нього, тож ви можете його вручну закрити або повернути в пул. В іншому випадку Close()повертає його до пулу.