NHibernate Evict Berdasarkan Jenis Dan Id Dari Cache Tingkat Pertama

Saya mempunyai objek Nhibernate bernama Mobil, objek Mobil ini memiliki koleksi IList PersietentBag yang disebut Pintu, semuanya dalam pemuatan lambat.

jika saya melakukannya (DALAM SESI 1)

int singleDoor = Car.Doors[0];

koleksi paling malas dimuat dari db dan objek terkait ditambahkan ke cache tingkat pertama, saya akan memiliki di cache tingkat 1 N objek Mobil dan N Pintu dimuat dari db.

Dari sisi lain (di bagian lain kode DALAM SESI 2) saya memuat objek Mobil yang sama dan melakukan tugas yang sama

int singleDoor = Car,Doors[0];

dan saya Mengeluarkan Mobil dan semua objek Pintu dari SESSION2

saya memodifikasi keadaan objek ini dan ingin melampirkan objek yang diambil ke SESSION1 untuk disimpan dan dilakukan

mySession.Update(Car);

Tetapi ketika saya mencoba memperbarui objek Pintu, jelas saya memiliki pengecualian (objek lain dengan id yang sama, dll) yang dilemparkan karena masih ada objek lain dengan id yang sama.

Bot sulit menemukan objek lama untuk diusir, bagaimana cara MENGUSUR objek lama atau menghapus cache tingkat 1 (hanya berdasarkan jenis dan id) atau membuang objek lama dari cache dan memperbarui apa yang saya inginkan?.

Terima kasih sebelumnya.


person manuellt    schedule 22.05.2012    source sumber


Jawaban (1)


Ini bukan karena cache tingkat kedua, melainkan karena Anda mencoba menyimpan entitas dari sesi 2 ketika sudah dimuat di sesi 1 (sebenarnya cache tingkat pertamalah yang menyebabkan hal ini).

Jawaban atas pertanyaan Anda adalah dengan menggunakan (di sesi 1), session.Evict(car), namun itu bukan pendekatan terbaik - saya lebih suka menyarankan menggunakan session.Merge(car) yang akan memperbarui objek persisten di sesi 1 tanpa melempar pengecualian tentang objek lain dengan id yang sama.

person Martin Ernst    schedule 22.05.2012
comment
Terima kasih, saya memperbaiki kesalahannya, ini adalah cache tingkat 1, sebenarnya sesi. Mengusir (Mobil) bukan pendekatan terbaik, namun saya tidak memiliki objek Mobil lama untuk Diusir, dengan pendekatan Penggabungan, jika saya punya perubahan status pada Mobil lama, perubahan status 2 Mobil telah digabungkan? atau perubahan status Mobil yang lama hilang? saya perlu membuang status Mobil lama, terima kasih sebelumnya. - person manuellt; 22.05.2012
comment
Anda dapat melakukan session.Get‹Car›(id) untuk mendapatkannya dari sesi dan kemudian mengeluarkannya, namun jika tidak ada dalam sesi tersebut, hal ini akan menyebabkan beban yang tidak perlu dari db. Session.Merge akan menimpa status mobil lama dengan yang baru - mis. itu akan membuang status mobil lama (jika Anda juga ingin menggabungkan koleksi anak apa pun, maka Anda perlu mengatur kaskade koleksi untuk digabungkan) - person Martin Ernst; 22.05.2012