Час від часу 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
тривалий час тримається відкритим і відключеним.
...
Закінчення сеансу включає чотири різних етапи:
- промити сеанс
- здійснити транзакцію
- закрити сесію
- обробляти винятки
Промивання сесії
Якщо ви користуєтесь ITransaction
API, вам не потрібно турбуватися про цей крок. Він буде виконуватися неявно, коли транзакція здійснена. В іншому випадку вам слід зателефонувати, 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()
повертає його до пулу.