EF 4.0は、以前のバージョンのEFに存在した多くの問題を修正します。 透過的な「遅延読み込み」 、 POCOクラス 、 コードのみなど。 EF 4.0はEF 1.0より明らかに優れています。
問題は、EFがまだ非常に若い製品であることです。 バージョン4で追加されたすべての変更は、表面にのみ影響しました。 EFおよびCode Onlyの POCOモデルに関する問題のいくつかについてはすでに書いたので、繰り返しません。 私が説明した問題から判断すると、主な難点は、コミュニティの経験とマイクロソフトの活動の間に壁があるということです。 これらのケースは両方とも、NHibernateおよびFluent NHibernateで発生した典型的な問題を示しています。 これらの問題はNHibernateで対処および解決されましたが、EFに表示されます。
しかし、私がレビューした問題を無視しても、NHibernateが成熟した製品であるという他の兆候があります。 Entity Framework Profilerマニュアルを書いたときにこれを理解しました。 EFでは単純にできないこともありますが、それはNHibernateの自然な部分です。
ポイントごとに違いのリストを作成しようとはしません。 NHibernateとEF 4.0の機能に大きな違いがある場合を見ていきます。 基本的に、これらはフレームワークが行うことを微調整する能力の違いです。 通常、これらは、OR / Mの使用を損なうことなく、システムのパフォーマンスを向上させる設定です。
だからここに短いリストがあります:
- バッチ書き込み-NHibernateは、データベースへのバッチ書き込みに設定できます。 データベースに対して複数の書き込みコマンドを実行する必要がある場合、NHibernateは各コマンドでデータベースにアクセスする代わりに、データベースへの1回の呼び出しでこれを実行できます。
- バッチ読み取り/複数のクエリ/将来の機能-NHibernateは、各コマンドのデータベースにアクセスする代わりに、単一のデータベース呼び出しでこれを行うことができます。
- コレクションのバッチダウンロード-「遅延読み込み」を使用してコレクションをダウンロードすると、NHibernateはダウンロードされていない同じタイプの他のコレクションを検索し、データベースに一度にすべてダウンロードします。 これは、SELECT N + 1の必要性を回避する素晴らしい方法です。
- 「遅延読み込み」のコレクション-「余分な遅延」は、NHibernateがコレクションの最上部で実行できる操作に適応することを意味します。 これは、blog.Posts.Countがコレクション全体を強制的にロードするのではなく、「BlogId = 1の投稿から選択カウント(*)」という式を作成し、blog.Posts.Contains()を計算する要求も行われることを意味します。コレクション全体はメモリにロードされません。
- コレクションフィルターとページコレクション-これにより、コレクションの上部で追加のフィルター(ページネーションを含む!) 。
- レベル2キャッシュ-キャッシュの管理は難しいタスクです。 これが重要である理由は既に示したので、 今回はこれをスキップします。
- フレームワークが提供するものを少し超えて何かを必要とするとき、微調整は非常に重要です。 NHibernateを使用すると、ほとんどすべての場合、既存のフレームワークを改善できますが、EFを使用すると、完全かつ永続的にブロックされます。
- 統合と拡張性-NHibernateには、NHibernate Search、NHibernate Validator、NHibernate Shardsなど、多数の追加プロジェクトがあります。 EFにとって、そのようなプロジェクトは存在しないだけでなく、EFが単にそのような機会を提供しないため、それらを書くことができません。
- EF 4.0の場合、既存のLinqプロバイダーは、現在のバージョンのNHibernateよりも適切に実装されています。 これが、NH 3.0がこのギャップを埋めるために積極的に取り組んできたことです。
- MicrosoftのEF。
翻訳者から:私自身は現在、小規模なASP.NET MVC2 + Entity Framework 1.0プロジェクトに参加しています。 他のOR / Mでは動作しなかったため、NHibernateとNHibernateを比較するのは興味深いものになりました。 エンティティフレームワーク。 OR / M(またはその他)の両方と密接に協力した人々の意見は興味深いです-Mr. Oren Einiはすべてを正しく書きましたか? 追加するものはありますか?