私は主にこの分野で2つのORMの長所と短所を決定しようとしています。
- SQL Server2008R2および2012との互換性。
- 既存のMSテクノロジスタックの不十分なサポートをデバッグするためのリソースがないため、これは非常に重要です。
- また、2012年以降の計画はほぼ終了しており、それに移行する計画があります。
- .NET 4.0および4.5のサポート(今後)
- 上記とほぼ同じ理由で、これも非常に重要です。
- トランザクション処理とテーブルヒント。forcescan forceeek、コミットされていない読み取り。
- 多くの場合、クエリオプティマイザはその仕事をうまく行いますが、それ以外の場合は、何をすべきかを柔軟に指示したいと思います。
- 会話、セルフトラッキングのアタッチとデタッチのサポート
- これはやや基本的なことです。私はセッションを長期間開いたままにするのが嫌いです。特に分散コンピューティング/Webファーム環境で。
- データを破壊することなく、コードの最初の開発を処理し、スキーマを作成および更新する機能。
- EF 4.1はこの点で望んでいるようですが、4.3は飛躍的でより優れています。また、NHの個別のマッピングクラスよりもデータアノテーションの方が好きです。理由は、クラスで送信できるようにし、そこからマッピングクラスのメソッドを拡張せずに永続性モデルを作成できるようにしたいからです。
- IRepositoryパターンのサポート
- LINQのサポート
- 上記の(6)にある程度結びついているので、linqを本当に適切にサポートしたいと思います。開発者が低レベルの実装をいじくり回して、特定のORMに固執することを望んでいません。
- パフォーマンス
- データをアプリケーション層にロードすることなく、一括CRUD操作をサポートします。例えば。特定のテーブルの列のすべての行を1つインクリメントしたい。これをメモリにロードしたくないので、行を1つずつインクリメントします。これは、このような単純な操作には夢中になるでしょう。Linq2Sqlは、この種のことを処理するためにMagiqを持っていましたが、NHとEFには何がありますか?
- キャッシング、積極的な読み込み、遅延読み込み、ナビゲーションプロパティ。
- 率直に言って、暗黙のうちに行われると、これらのことは嫌いです。キャッシュされているもの、古いものと新しいものを区別するのが難しい理由。EFでは、通常、すべてのナビゲーションプロパティを削除します。これは、これらのプロパティに上位5をロードしたくないためです。これは、現在の操作に必要なものですが、さらに下流では、別の開発者が不正確なカウントを実行しようとします。
- したがって、私の個人的なポリシー-他に正当な理由がない限り、すべてのSOAはステートレスになります。データを参照する必要がある場合は、永続性から取得してください。遅くなりますが、コードはより読みやすく柔軟になります。
- キャッシングについても同様です。分散環境にあるので十分に複雑なので、すべてのキャッシングを非常に明示的にしたいと思います。開発者がキャッシュに対してコーディングしたい場合は、ORMに対してコーディングするのではなく、そうする必要があります。実際には古いデータを取得しているときに、永続性から新しいデータをプルしているように見せます。
- ここで問題となるのは、NHibernateには、キャッシング、熱心な/遅延読み込みを、現在EFで利用可能なものよりもはるかに明確にする概念/抽象化がありますか?この場合、開発のしやすさはあまり気にせず、明快さと明確さを気にします。
また、私はOSS対所有者の議論をあまり気にしません。チームは、内部を覗き込んで他の人のコードをいじり始める時間をとることができません。私は何よりも「うまくいく」という角度に関心があります。