Dari waktu ke waktu ISession
kehendak menjalankan pernyataan SQL yang diperlukan untuk menyinkronkan keadaan koneksi ADO.NET dengan keadaan objek yang disimpan dalam memori. Proses ini, flush, terjadi secara default di titik-titik berikut
- dari beberapa doa
Find()
atauEnumerable()
- dari
NHibernate.ITransaction.Commit()
- dari
ISession.Flush()
Pernyataan SQL dikeluarkan dalam urutan berikut
- semua insersi entitas, dalam urutan yang sama objek terkait disimpan menggunakan
ISession.Save()
- semua pembaruan entitas
- semua penghapusan koleksi
- semua penghapusan, pembaruan, dan sisipan elemen koleksi
- semua sisipan koleksi
- semua penghapusan entitas, dalam urutan yang sama objek terkait dihapus menggunakan
ISession.Delete()
(Pengecualian adalah objek yang menggunakan generasi ID asli dimasukkan saat disimpan.)
Kecuali ketika Anda menjelaskannya Flush()
, sama sekali tidak ada jaminan tentang kapan Sesi mengeksekusi panggilan ADO.NET, hanya urutan di mana mereka dieksekusi . Namun, NHibernate tidak menjamin bahwa ISession.Find(..)
metode tidak akan pernah mengembalikan data basi; mereka juga tidak akan mengembalikan data yang salah.
Dimungkinkan untuk mengubah perilaku default sehingga flush terjadi lebih jarang. The FlushMode
kelas mendefinisikan tiga mode yang berbeda: hanya siram pada komit waktu (dan hanya jika NHibernate ITransaction
API digunakan), siram otomatis menggunakan menjelaskan rutin, atau tidak pernah menyiram kecuali Flush()
disebut secara eksplisit. Mode terakhir berguna untuk unit kerja yang berjalan lama, di mana sebuah ISession
tetap terbuka dan terputus untuk waktu yang lama.
...
Mengakhiri sesi melibatkan empat fase berbeda:
- siram sesi
- melakukan transaksi
- tutup sesi
- menangani pengecualian
Menyiram Sesi
Jika Anda menggunakan ITransaction
API, Anda tidak perlu khawatir tentang langkah ini. Ini akan dilakukan secara implisit ketika transaksi dilakukan. Kalau tidak, Anda harus menelepon ISession.Flush()
untuk memastikan bahwa semua perubahan disinkronkan dengan database.
Melakukan transaksi basis data
Jika Anda menggunakan NHibernate ITransaction API, ini terlihat seperti:
tx.Commit(); // flush the session and commit the transaction
Jika Anda mengelola sendiri transaksi ADO.NET, Anda harus secara manual Commit()
melakukan transaksi ADO.NET.
sess.Flush();
currentTransaction.Commit();
Jika Anda memutuskan untuk tidak melakukan perubahan:
tx.Rollback(); // rollback the transaction
atau:
currentTransaction.Rollback();
Jika Anda mengembalikan transaksi, Anda harus segera menutup dan membuang sesi saat ini untuk memastikan bahwa kondisi internal NHibernate konsisten.
Menutup ISession
Panggilan untuk ISession.Close()
menandai akhir sesi. Implikasi utama dari Close () adalah bahwa koneksi ADO.NET akan dilepaskan oleh sesi.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Jika Anda menyediakan koneksi Anda sendiri, Close()
kembalikan referensi ke sana, sehingga Anda bisa menutupnya secara manual atau mengembalikannya ke pool. Kalau tidak, Close()
kembalikan ke kolam renang.
Mulai di NHibernate 2.0, transaksi diperlukan untuk operasi DB. Oleh karena itu,
ITransaction.Commit()
panggilan akan menangani pembilasan yang diperlukan. Jika karena alasan tertentu Anda tidak menggunakan transaksi NHibernate, maka tidak akan ada pembilasan sesi secara otomatis.sumber
Dari waktu ke waktu ISession akan menjalankan pernyataan SQL yang diperlukan untuk menyinkronkan keadaan koneksi ADO.NET dengan keadaan objek yang disimpan dalam memori.
Dan selalu gunakan
setelah perubahan dilakukan daripada perubahan ini untuk disimpan ke dalam basis data, kami menggunakan transaction.Commit ();
sumber
Berikut adalah dua contoh kode saya di mana ia akan gagal tanpa sesi.Flush ():
http://www.lucidcoding.blogspot.co.uk/2012/05/changing-type-of-entity-persistence.html
di akhir ini, Anda dapat melihat bagian kode tempat saya mengaktifkan penyisipan identitas, menyimpan entitas lalu menyiram, lalu mematikan penyisipan identitas. Tanpa flush ini tampaknya mengatur dan memasukkan identitas kemudian menyimpan entitas.
Penggunaan Flush () memberi saya lebih banyak kontrol atas apa yang sedang terjadi.
Ini adalah contoh lain:
Mengirim pesan NServiceBus di dalam TransactionScope
Saya tidak sepenuhnya mengerti mengapa yang satu ini, tetapi Flush () mencegah kesalahan saya terjadi.
sumber