NHibernate & Membatalkan Perubahan pada Entitas

Sepertinya ini adalah masalah umum, tetapi saya tidak tahu cara terbaik untuk menyelesaikannya. Saya ingin dapat mengirim Entitas ke tampilan, melakukan perubahan pada entitas dalam tampilan, tetapi kemudian membatalkan (menghapus) perubahan tersebut jika pengguna membatalkan tampilan. Apa cara yang tepat untuk melakukan ini.

Berikut adalah dua opsi yang saya miliki tetapi menurut saya seharusnya ada opsi lain yang lebih baik

1) Ambil entitas, buat klon, kirim klon ke tampilan...jika perubahan diterima, perbarui entitas asli dengan nilai klon

2) Kirim entitas ke tampilan, jika pengguna membatalkan, hapus entitas dari cache NHibernate dan muat ulang dari database

Untuk (2), masalah bagi saya adalah entitas lama masih dapat direferensikan di seluruh proyek saya setelah dihapus dari cache.

Sunting:

Oke, jadi metode evict adalah cara yang harus dilakukan jika saya menerapkan metode (2). Terima kasih, saya tidak dapat mengingat detailnya. Namun, masalah objek tampilan yang merujuk pada entitas lama saya yang telah diusir membuat masalah ini sulit untuk ditangani. Saya tidak bisa begitu saja membuat tampilan saya diperbarui secara otomatis ke entitas baru tanpa memiliki kode khusus di masing-masing entitas untuk diikat ulang ketika peristiwa penggusuran khusus saya dimunculkan. Dan rebinding mungkin bukan hal yang sepele dalam kasus tertentu. Saya perlu memikirkan hal ini lagi karena mungkin terlalu rumit, tetapi saat ini, metode ini tampaknya lebih rumit.

Saya kira saya akan terjebak dengan metode (1) yang memiliki serangkaian masalahnya sendiri tetapi akan menunggu lebih lama untuk melihat apakah ada orang lain yang punya ide.

Edit 2: Baru saja menemukan ini. Saya pikir ini cukup banyak mencakup jawaban secara detail dan dilengkapi dengan proyek demo yang hebat - Membangun Aplikasi Agenda Desktop dengan NHibernate - http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

Selain itu, NHibernate memiliki fungsi Session.Refresh(Object entitas) yang tampaknya menyelesaikan masalah sebenarnya. Jadi, ketika suatu entitas diubah tetapi kemudian dibatalkan sebelum disimpan, saya cukup memanggil Session.Refresh untuk memuatnya kembali dari database dan membuang perubahannya.


person i8abug    schedule 30.03.2010    source sumber
comment
Masalah umum dengan Refresh terjadi ketika entitas memiliki hubungan bertingkat, maka anak-anak tersebut (entitas terkait) juga akan disegarkan - Hal ini dapat menyebabkan dampak kinerja yang nyata. Saya baru saja menghadapi masalah yang saya jelaskan, jadi informasi ini dapat membantu orang lain   -  person jweyrich    schedule 21.12.2015


Jawaban (2)


Saya akan memilih opsi 1 dan menggunakan apa yang disebut ViewModel alih-alih entitas Anda. ViewModel adalah representasi model Anda untuk tampilan tertentu. Di ViewModel Anda dapat menggabungkan data dari entitas berbeda dan nilai pra-format agar sesuai dengan tampilan. Merupakan cara yang elegan untuk meneruskan data ke tampilan dan Anda dapat mencapai apa yang Anda inginkan dengan mudah.

Menggunakan ViewModels menjadi cara kerja yang disukai di ASP.net MVC dan Silverlight/WPF.

Untuk membaca lebih lanjut tentang Viewmodels: http://blogs.msdn.com/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

person Ariel Popovsky    schedule 30.03.2010
comment
Saya akhirnya menggunakan solusi ini. Namun menurut saya ini tidak ideal karena terkadang entitas saya berisi persis apa yang seharusnya ada dalam pandangan saya dan saya tidak suka harus menyalin propertinya ke sesuatu yang lain. Namun, sebagian besar tampaknya baik-baik saja. Terima kasih - person i8abug; 14.10.2010
comment
Pada akhirnya Anda akan terbiasa. Saya sarankan menggunakan Automapper untuk meringankan kesulitan menyalin data bolak-balik. automapper.codeplex.com - person Ariel Popovsky; 15.10.2010
comment
itu menyakitkan pada awalnya, dan gagasan untuk mengimplementasikan tipe kedua supaya Anda dapat mengubah bentuk model/data menjadi sesuatu yang sesuai dengan tampilan, membuat saya ingin berteriak! - Saya menentang ide ini selama hampir satu tahun, dan akhirnya harus menghadapi kenyataan bahwa NH dan ASP.NET MVC tidak dirancang untuk pendekatan lain. Bahkan jika itu membuat Anda merasa ngeri, saya sangat menyarankan Anda untuk melupakan KERING dan menerima duplikasi tingkat tinggi; untuk itulah alat ini dirancang. Berenang melawan arus akan menimbulkan rasa sakit dan tidak ada imbalan yang nyata. - person mindplay.dk; 23.02.2012

Cara terbaik untuk melakukan ini adalah dengan memanggil metode Evict pada ISession yang digunakan untuk memuat objek. Ini akan menghapus objek dari cache sesi. dan Anda kemudian dapat memuat ulang dan menampilkannya kembali.

Mengeluarkan objek dari sesi akan membuatnya transient terlepas sehingga jika masih ada referensi ke objek tersebut dalam proyek, maka objek tersebut tidak akan bertahan saat sesi dihapus. Cara Anda mengatasinya bergantung pada aplikasi Anda, tetapi saya sarankan untuk mengadakan acara untuk memberi tahu pelanggan bahwa mereka perlu memuat ulang objek tersebut.

person Jamie Ide    schedule 30.03.2010