NHibernateユーザープログラマーが犯す最も一般的な間違いとアンチパターンは何ですか?


28

NHibernateユーザープログラマーが犯す最も一般的な間違いとアンチパターンは何ですか?それらが悪い習慣である理由を説明するか、さらに読むためにリソースへのリンクを提供してください。

例えば:

  • 新しいNHibernateプログラマに共通するアンチパターンの1つは、ORMスタイルの1回ではなく、アイデンティティ/ネイティブPOIDを使用することです。詳細はこちら...

1
あなたはここでよくある間違いのいくつかを見つけることができます。NHProfアラート

1
また、ここについてのいくつかの貴重な記事があるNHibernateの落とし穴

回答:


34

私の個人的な「よく説明される」問題:

アンチパターン

DTOを使用する代わりに、切り離されたオブジェクト(SaveOrUpdateまたはMergeといくつかの乱雑なコード)をいじります。エンティティが複雑になるほど、コードはより複雑になります。(それはまた、些細なエンティティで非常にうまく機能することを意味します。)Ayendeはまた、ストリッパーパターンと呼び、カプセル化の問題を説明します。

明示的なSQLを使用する場合のように、永続性の無知を理解せず、NHアプリケーションを記述しません。その症状:オブジェクトを変更した後にUpdateを呼び出す、Updateが呼び出されていなくても変更が永続化される理由、および変更が永続化されるのを回避する方法を疑問に思う。

トランザクション作業単位のパターンを理解していない。頻繁なアンチパターン:暗黙的なトランザクション、操作ごとのセッション、アプリケーションごとのセッション。もっと読む:

NH イベントを使用してアプリケーションロジックを挿入する(たとえば、挿入および更新トリガーの変更追跡)

テーブルごとに1つのクラスを作成します。OODを理解していない人もいれば、リレーショナルデザインを理解していない人もいます。

間違い

使用1対1の代わりに、多対1。この答えで説明しようとしました。

使用すると、フェッチ参加 SetMaxResultとの組み合わせで。そのトピックに関連する私の最新の回答:

ライティング自己変更エンティティを。エンティティがNHによって設定された値を正確に返さない場合、そのエンティティはダーティと見なされ、すべてのセッションで更新されます。たとえば、プロパティセッターのNH永続コレクションを置き換えます。

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

もっと続くかもしれません。


2
+1:「作業単位パターンを使用しない」と「アプリケーションごとに1セッション」をリストに追加する必要があります。
ファルコン

@ファルコン:ええ、おそらく。これは一般的な「トランザクションを理解していない」問題です。作業単位は、永続性の無知に少し覆われています。これらは完全に異なる概念ですが、同じパターンになります。
ステファンSteinegger

5

Select N + 1 Problem」。

これは、すべてのエンティティとその属性の単一選択ではなく、操作する各エンティティの選択(N)と、エンティティのリストを取得する選択(+1)を実行する場所です。


1
  • 抽象化が多すぎる
  • 自動マッピングを使用しない FluentNHibernate

最初の点は少しあいまいですが、「リポジトリ」または「DAO」の背後にISessionを隠すような愚かな概念を参照している場合は、同意します。
クリス

1
ただし、2番目のポイントはナンセンスです。物理データモデルをきめ細かく制御し、それをドメインモデルから分離できるようにすることがよくあるのには、十分な理由があります。結局のところ、それが「ORM」の「M」のポイントです。自動マッピングを使用すると(単純なシナリオでは便利ですが)、それは無効になります。それに加えて、自動マッピングが役に立たないレガシーデータベーススキーマの統合の問題もあります。
クリス14年

私は組み込みのコード規約ベースのマッピングを使用します。それは私がそうでなければ繰り返さなければならないがらくたの大きな帯を処理します。ただし、従来の方法で生成されたマッピングの上に階層化されたエンティティ固有のカスタマイズを自由に行うことができます。その超便利。
サム14

1

後からEntity Framework(または他の何か)に切り替えることができるように、抽象化しようとします。

これは、それを実現しようとするほとんどの人よりもはるかに困難です。両者の間には多くの違いがあり、時には微妙な場合もあります。また、最終的に実際に必要になることは非常にまれです-あなたのアプローチがすべて間違っていることを発見する前に、何年も細心の注意を払って実装しようとすることができるほどです。

また、2次キャッシュ、インターセプト、同時実行管理、変更追跡、プリフェッチクエリなど、NHibernateの便利で重要な機能を使用することを制限します。

実際にNHibernateとEntity Frameworkを切り替える必要がある場合は、GitHub(おそらくCommonServiceLocatorと似たようなもの)でこれをサポートするために、多数の貢献者とプルリクエストで積極的に開発されたプロジェクトがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.