NHibernate kullanıcı programcılarının yaptığı en yaygın hatalar ve anti-paternler nelerdir?


28

NHibernate kullanıcı programcılarının yaptığı en yaygın hatalar ve anti-paternler nelerdir? Lütfen bunların neden kötü uygulama olduğunu açıklayın veya daha fazla okumak için kaynağa bağlantı verin.

Örneğin:


1
Yaygın hatalardan bazılarını burada bulabilirsiniz: NHProf Alerts

1
Ayrıca burada NHibernate Pitfalls

Yanıtlar:


34

Benim kişisel "sıkça açıklanmış" konular:

Anti-Patterns

İle karıştırmasını müstakil nesneler yerine DTO en kullanmanın (SaveOrUpdate veya Birleştirme artı bazı dağınık kodu). Varlıklar ne kadar karmaşıksa, kod o kadar karışık olur. (Aynı zamanda önemsiz varlıklar ile oldukça iyi çalıştığı anlamına gelir.) Ayende ayrıca Stripper Paterni olarak adlandırır ve kapsülleme sorununu açıklar.

Sebatsizlik cehaletini anlamak ve açık SQL kullanırken olduğu gibi NH uygulamaları yazmak. Bunun bir belirtisi: Bir nesneyi değiştirdikten sonra Update'i çağırmak, Güncelleme çağrılmamış olsa bile neden değişikliklerin sürdüğünü merak etmek, değişikliklerin sürekliliğini nasıl önleyeceğinizi merak etmek.

İşlemleri ve kalıbı birimini anlama . Sık rastlanan anti-paternler: örtülü işlemler, işlem başına oturum ve uygulama başına oturum. Biraz daha okuma:

Uygulama mantığını yerleştirmek için NH olaylarını kullanma (örneğin, ekleme ve güncelleme tetikleyicilerinde izlemeyi değiştirme)

Tablo başına bir sınıf oluşturun . Bazı insanlar OOD'yi anlamıyor, bazıları ilişkisel tasarımı anlamıyor.

hatalar

kullanımı biri bire yerine birçok bire. Bu cevapta açıklamaya çalıştım .

Kullanılması getirme katılmak SetMaxResult birlikte. Bu konuyla ilgili en son cevaplarım:

Kendini değiştiren varlıkları yazma . Bir işletme NH tarafından belirlenen değeri tam olarak geri getirmediğinde, kirli sayılır ve her oturumda güncellenir. Örneğin: NH kalıcı koleksiyonunu bir özellik ayarlayıcıda değiştirmek.

  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; }
  }

Daha fazla olabilir takip ediyor.


2
+1: Listenize "Çalışma Birimi Kullanmıyor desen" ve "Uygulama başına bir oturum" eklemelisiniz.
Falcon,

@ Yonca: evet muhtemelen. Bu genel bir "işlemleri anlama" sorunu. İş birimi ısrarla cehalet tarafından biraz kaplıdır. Tamamen farklı kavramlar olmasına rağmen, aynı kalıplarla sonuçlanırlar.
Stefan Steinegger

5

" N + 1 Problemini Seç ".

Bu, işlem yapmak istediğiniz yerde, üzerinde değişiklik yapmak istediğiniz her varlık için bir seçim (N) ve tüm varlıkların ve niteliklerinin tek bir seçimi yerine, varlıkların listesini (+1) alma seçimini yapın.


1
  • Çok fazla soyutlama
  • Otomatikleştirmeleri kullanmama FluentNHibernate

İlk nokta biraz belirsizdir, ancak "Depo" veya "DAO" nun arkasındaki Hükmü saklayan aptalca fikirlere atıfta bulunmanız durumunda, katılıyorum.
Chris

1
İkinci nokta ise saçmalık. Fiziksel veri modeli üzerinde hassas bir kontrol sahibi olmak istememizin ve bunu etki alanı modelinden ayırabilmemiz için iyi nedenler var. Ne de olsa, "ORM" deki "M" nin noktası budur. Otomatik eşlemelerin kullanılması (basit senaryolarda faydalı olsa da) bunu yener. Ayrıca, otomatik eşlemenin işe yaramaz olduğu entegrasyon eski veritabanı şemaları da var.
Chris

Yerleşik kodu kod kuralları esaslı eşleme ile kullanıyorum. Aksi takdirde tekrarlamak zorunda kalacağım boktan bir iş. Ancak yine de, konvansiyon tarafından oluşturulan haritalamanın üzerine yerleştirilmiş olan özel kişiselleştirme özgürlüğünü ancak varlığını sağlar. Süper yardımcı oldu.
Sam

1

Daha sonra tarihte Entity Framework'e (ya da başka bir şeye) geçebilmek için soyutlamaya çalışmak.

Bu, girişimde bulunan çoğu insandan çok, çok daha zor. İkisi arasında sizi zaman zaman çok ince olabilecek şekillerde yönlendirebilecek sayısız farklılıklar vardır. Sonunda gerçekten ihtiyaç duyulması da çok nadirdir - o kadar ki, yaklaşımınızın tamamen yanlış olduğunu keşfetmeden önce yıllarca titizlikle uygulamaya çalışabilirsiniz.

Ayrıca, sizi NHibernate'nin ikinci düzey önbellekleme, durdurma, eşzamanlılık yönetimi, değişiklik izleme, ön ekli sorgulama vb.

Eğer NHibernate ve Entity Framework arasında geçiş yapmak için gerçekten geçerli bir ihtiyaç varsa, bu projeyi GitHub'ta (belki de CommonServiceLocator'a benzer bir damarda bulunan bir şey) sayısız katkıda bulunan ve çekme istekleriyle desteklemek için aktif olarak geliştirilmiş bir proje olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.