BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース NHibernate と Entity Frameworkの比較

NHibernate と Entity Frameworkの比較

ブックマーク

原文(投稿日:2012/06/11)へのリンク

ポルトガルの 開発者Ricardo Peres氏は、主要な.NET ORMであるNHibernate と Entity Framework を見たところ公平に比較し、公表した。両方を考えている人には、彼の記事、NHibernate と Entity Frameworkの差を読むことを薦めるが、主要な差の幾つかは、難しい。

構造的にNHibernateは、JavaのHibernateのORMに基づいている。氏は次のように書いている:

NHibernateでは、 Unit of Workと構成とモデルインスタンス間には区別がある。まず Configurationオブジェクトの作成から始めるが、その際使うデータベースや方言、バッチのサイズ、マッピングなどのような全グローバルな NHibernate設定を決める。次にそれから ISessionFactoryを構築する。。ISessionFactoryは、特定のデータベースおよびConfigurationオブジェクトからの設定に縛られているモデルとメタデータを保持し、通常各プロセスにはインスタンスは1つだけ存在する。 最後に、 Unit of Work と Identity Mapの NHibernate表現である、 IsessionFactoryからISessionのインスタンスを作成する。これは軽量のオブジェクトであり、それは基本的にデータベース接続を必要に応じて 開き、閉じ、それに関連付けられたエンティティを追跡する。モデルの複雑さのすべてがISessionFactoryとConfigurationオブジェクトに格納されているため、ISessionのオブジェクトは、作成および配置することが安価である。

評者のMorten Mertner 氏は「私はNHに満足できなかった。素晴らしいフィーチャーリストだが、製品を使うのは容易でない。API/デザインはJavaから継承した匂いがする(多くのJavaAPIは余りに高く付き、過剰な構造である。YMMW)」と言っている。

Entity Frameworkは、すべてが単一の ObjectContext あるいは DbContextにカプセル化された、より伝統的な.NETのデザインに従っている。このため、オブジェクトを使うのがずっと単純になるが、欠点は、「それ故にクラスは、そのNHibernateの対応クラスほど軽量ではなく、インスタンス がフィールドにキャッシュされる、例を見るのも例外ではない」ことである。

マッピングに関しては、NHibernateはとEntity Frameworkの主な違いは、前者が個別に展開されるXMLベースのマッピング・ファイルをサポートしていることだ。理論的には、これによって、アプリケーションを再コンパイルせずに別のデータベース・スキーマに対して同じオブジェクトモデルを使用することができる。実際にこれが使われるのは、稀である。

古いNHibernateがEntity Frameworkより勝るいくつかの領域がある。Ricardo 氏が詳細を提供しているが、簡単に、それらを述べると:

  • 関連付け:両方共1:1,1:多、多: 多をサポートするが、 NHibernateはまた、様々な順序、非順序、インデックス付きオプションもサポートしている。イミュータブルなインデックス付きリストさえもある。
  • キャッシング:NHibernateは多くの実装による2次レベルのキャッシュを提供している。 Entity Frameworkには、組込まれたこのようなキャッシュはない。しかし、2次レベルのキャッシュを追加するサンプルがある。
  • ID 生成:NHibernate は、その数え方によるが概ね1ダースの戦略を提供している。 Entity FrameworkはSQLサーバー向けに主に3つ提供しているだけである:ID列、GUID, 手動による割当て。
  • イベント: Entity Frameworkだけが2つのイベントベースの拡張点を持つ。 ObjectMaterializedSavingChanges。「 NHibernateは非常にリッチなイベントモデルを持ち、20以上のイベントを公開し、同期プレ実行と非同期ポスト実行のいずれでも使える。」
  • カスケーディング: 「コレクションと関連付けの両方にカスケーディングをサポート:エンティティが消去されると、その概念的子供も消去される。NHibernate も削除する代わりに、子供に外部キー列をNULLに設定する可能性を提供する。
  • 変更のフラッシュ: NHibernateは、必要な時に変更が保存される自動モードを提供している。例えば「もしエンティティ型の変更されたインスタンスがあり、このエンティティ型に対してクエリが実行される」ような場合に。FlushMode.Autoは、実際デフォルトであるが、自動フラッシュがパフォーマンス問題で非難されるのは、珍しくない。

Entity Frameworkが 現在NHibernateに対して優っている領域が少しある。例えば、

  • 変更の追跡:両方の変更追跡のデフォルトは、作業レベルの単位だが、Entity Frameworkは自己追跡エンティティも提供する。
  • 統合:もちろんEntity Frameworkは、Visual StudioとさまざまなASP.NETとWCFライブラリと密接な関係を持ってい る。
  • ドキュメント:「これは、Entity Frameworkが優れている別の点だ。NHibernateは、初心者向けの、現在のバージョンと同期したAPIリファレンスがない。 」
  • クエリ:Craig氏は次のように書いている。「NHibernate は1つ領域、Linqを除いて、ずっとフィーチャがリッチである。LINQまたは他のクエリ言語では多くのユーザーのためにORMの最も目に見える部分なので、それは能力の誤った印象を与 える。」

両方がバッチ処理のように改善を必要とする領域もある。どちらのORMも、共通テーブル式のようなSQLの高度なフィーチャを本当に利用するとなると、SQL Alchemy には及ばない。

両方のプロジェクトはかなり活動的であり、両方とも改善がかなり定期的に見られることは、留意すべきである。もし両方が自分の最小要件を満たしていれば、機能リストよりもライブラリのデザインパターンと哲学にもっと焦点を当て検討すべきである。

この記事に星をつける

おすすめ度
スタイル

BT