Apa kesalahan paling umum dan anti-pola yang dibuat oleh pemrogram pengguna NHibernate?

28

Apa kesalahan paling umum dan anti-pola yang dibuat oleh pemrogram pengguna NHibernate? Tolong jelaskan mengapa itu adalah praktik buruk atau berikan tautan ke sumber daya untuk bacaan lebih lanjut.

Sebagai contoh:

  • Salah satu anti-pola umum untuk programmer NHibernate baru adalah dengan menggunakan identitas / POID asli sebagai ganti dari ORM style onces. Baca lebih lanjut di sini ...
Darius Kucinskas
sumber
1
Anda dapat menemukan beberapa kesalahan umum di sini: NHProf Alerts
1
Juga ada beberapa posting berharga di sini tentang NHibernate Pitfalls

Jawaban:

34

Masalah pribadi saya "yang sering dijelaskan":

Anti-Pola

Bergaul dengan benda-benda terpisah (SaveOrUpdate atau Gabung ditambah beberapa kode berantakan) daripada menggunakan DTO. Semakin kompleks entitasnya, semakin berantakan kodenya. (Ini juga berarti bahwa ia bekerja dengan sangat baik dengan entitas sepele.) Ayende juga menyebutnya Pola Stripper dan menjelaskan masalah enkapsulasi.

Ketidaktahuan memahami ketidaktahuan dan menulis aplikasi NH seperti ketika menggunakan SQL eksplisit. Gejala dari itu: memanggil Pembaruan setelah mengubah objek, bertanya-tanya mengapa perubahan tetap ada bahkan jika Pembaruan belum dipanggil, bertanya-tanya bagaimana cara menghindari perubahan yang harus dipertahankan.

Tidak memahami transaksi dan pola unit kerja . Anti-pola yang sering: transaksi implisit, sesi-per-operasi dan sesi-per-aplikasi. Beberapa bacaan lagi:

Menggunakan acara NH untuk memasukkan logika aplikasi (mis. Ubah pelacakan di sisipkan dan perbarui pemicu)

Buat satu kelas per tabel . Beberapa orang tidak mengerti OOD, yang lain tidak mengerti desain relasional.

Kesalahan

penggunaan satu-ke-satu, bukan banyak-ke-satu. Saya mencoba menjelaskannya dalam jawaban ini .

Menggunakan join fetch dalam kombinasi dengan SetMaxResult. Jawaban terakhir saya terkait dengan topik itu:

Menulis entitas yang berubah sendiri . Ketika suatu entitas tidak secara tepat mengembalikan nilai yang telah ditetapkan oleh NH, itu dianggap kotor dan diperbarui di setiap sesi. Misalnya: mengganti koleksi persisten NH di setter properti.

  IList<Address> Addresses
  {
    get { return addresses; }
    // will cause the addresses collection to be built up from scratch
    // in the database in every session, even when just reading the entity.
    set { addresses = new List<Address>(value); }
  }

  int Whatever
  {
    // will make the entity dirty after reading negative values from the db.
    // this causes unexpected updates after just reading the entity.
    get { if (whatever < 0) return 0; }
    set { whatever = value; }
  }

Mungkin lebih banyak yang mengikuti.

Stefan Steinegger
sumber
2
+1: Anda harus menambahkan "Tidak menggunakan pola Unit Kerja" dan "Satu sesi per aplikasi" ke daftar Anda.
Falcon
@ Falcon: ya mungkin. Ini masalah umum "tidak memahami transaksi". Unit kerja agak ditutupi oleh ketidaktahuan kegigihan. Meskipun mereka adalah konsep yang sama sekali berbeda, mereka menghasilkan pola yang sama.
Stefan Steinegger
5

" Pilih N + 1 Masalah ".

Di sinilah Anda akhirnya mengeksekusi pilih untuk setiap entitas yang ingin Anda manipulasi (N), dan pilih untuk mendapatkan daftar entitas (+1), alih-alih pemilihan tunggal dari semua entitas dan atributnya.

Sean McMillan
sumber
1
  • Terlalu banyak abstraksi
  • Tidak menggunakan Automappings dengan FluentNHibernate
Licik
sumber
Poin pertama agak kabur, tetapi jika Anda merujuk pada gagasan konyol seperti menyembunyikan Sesi di balik "Repositori" atau "DAO", saya setuju.
chris
1
Poin kedua adalah omong kosong. Ada alasan bagus mengapa kita sering ingin memiliki kendali yang baik atas model data fisik dan dapat memisahkannya dari model domain. Lagi pula, itulah inti dari "M" di "ORM". Menggunakan automappings (walaupun berguna dalam skenario sederhana) mengalahkan itu. Selain itu, ada juga masalah skema integrasi basis data warisan, yang automapping tidak berguna.
chris
Saya menggunakan pemetaan berdasarkan konvensi kode inbuilt. Ini menangani omong kosong besar yang seharusnya saya ulangi. Namun itu masih memberikan kebebasan untuk tetapi kustomisasi khusus entitas yang berlapis atas pemetaan yang dihasilkan oleh konvensi. Sangat membantu.
Sam
1

Mencoba untuk mengabstraksikannya sehingga Anda bisa beralih ke Entity Framework (atau sesuatu yang lain) di kemudian hari.

Ini jauh, jauh lebih sulit daripada kebanyakan orang yang berusaha mewujudkannya. Ada banyak perbedaan di antara keduanya yang bisa membuat Anda tersandung dengan cara yang kadang-kadang cukup halus. Ini juga sangat tidak biasa untuk benar-benar diperlukan pada akhirnya - sangat banyak sehingga Anda dapat dengan cermat mencoba menerapkannya selama bertahun-tahun sebelum menemukan bahwa pendekatan Anda semuanya salah.

Selain itu, ini membatasi Anda untuk menggunakan banyak fitur NHibernate yang berguna dan penting seperti caching level dua, intersepsi, manajemen konkurensi, pelacakan perubahan, permintaan prefetch, dan sebagainya.

Jika benar-benar ada kebutuhan yang sah untuk beralih antara NHibernate dan Entity Framework, akan ada proyek yang dikembangkan secara aktif untuk mendukung ini di GitHub (mungkin sesuatu yang mirip dengan CommonServiceLocator) dengan banyak kontributor dan permintaan tarik.

jammycakes
sumber