9

最近、利用可能な .NET ベースの ORM を調べています。それぞれが 1 つまたは 2 つのキャンプに配置されることに気付きました。ある陣営では、データベースが最初に作成され、ORM はアプリケーションでデータベースにアクセスするためのより簡単な方法を提供します。2 番目の陣営では、オブジェクト モデルが最初に存在し、ORM によってオブジェクト モデルのデータベースへの永続化が容易になります。

ここで私は、ある陣営が他の陣営よりも優れているかどうかを尋ねたり、主張したりしているわけではありません。それぞれの設計方法論の理由が確かにわかります。私を苛立たせているのは、私が最近読んだすべてのチュートリアルと「入門」ドキュメントのうち、どれも出てきて、最初に「このツールは、既存のデータベース/オブジェクトモデルから始めていることを前提としています」と言うだけです. 私にとって、これは、ある ORM を使用するか、別の ORM を使用するかについて非常に基本的なことです。

それで、たくさん読んで、いくつかの「Hello World」プロジェクトを作成した後、調べた ORM でサポートされているワークフローに関する一連の箇条書きをまとめました。これらのツールを使用した経験のある人なら、私が間違った発言をしたり、本当に重要な点を完全に見逃したりしていないか教えてもらえますか? 具体的には、各ツールでデータベース スキーマまたはオブジェクト モデルを最初に使用する必要があるかどうかについての私の仮定が正しいかどうかを知りたいです。

Linq から SQL へ

  • データベースが最初に存在する必要があります
  • SQL Server でのみ動作します
  • DataContext クラスは、クラスとデータベース間の読み取り/書き込みに使用されます
  • DataContext は実際の物理クラスを返すか、動的型を使用してデータベース スキーマに基づいて型を自動的に作成できます。
  • テーブル名をクラス名に、プロパティ名を列名にマッピングするデフォルトのマッピング
  • マッピングは、各クラスに埋め込まれた属性を介してカスタマイズできます

Subsonic (アクティブレコード)

  • 最初にデータベースを作成する必要があります
  • 多数のデータベース技術と連携
  • クラスは、T4 テンプレートを使用して既存のデータベース スキーマから自動的に生成されます
  • クラスが生成されると、データベースへの接続は完全に透過的になります
    • クラスコンストラクターを呼び出すと、データベースにレコードが自動的に作成されます
    • プロパティ値を変更すると、データベースが自動的に更新されます。

Subsonic (簡易リポジトリ)

  • クラス構造が最初に来るべきです
  • 多数のデータベース技術と連携
  • リポジトリ クラスが作成され、データベースに接続されます
  • クラスがリポジトリに追加されると、データベース スキーマが自動的に作成および更新されます。
    • repo.Add<MyClass>(instance);
    • リポジトリはリフレクションを使用してデータベース スキーマを作成/更新します
    • 時間ごとにテーブルを作成し、プロパティごとに列を作成します

NHibernate

  • データベースまたはクラス構造のいずれかを最初に作成できます
  • 多数のデータベース技術と連携
  • 最終アセンブリ内のクラスは、クラスとプロパティをテーブルと列にマップする NHibernate マッピング設定で属性付けされます
  • マッピング構成を追加するには 2 つの方法があります
    • バイナリに埋め込まれた XML ファイル、<classname>.hbm.xml
    • コードに追加された属性
  • 1 対 1、1 対 5、多対 1、多対多、継承などを含む高度なマッピング構成をサポートしています。
4

3 に答える 3

2

Entity Framework を取り上げたコメントの続き:

Entity Framework (ウィキペディアにも適切に構造化された情報がいくつかあります)

  • コード ファースト、モデル ファースト、データベース ファーストの両方の開発をサポートします。コード ファーストとモデル ファーストの違いは、コード ファーストでは最初にエンティティ クラスを記述するのに対し、モデル ファーストでは最初にデータ モデルを設計し、それに基づいてエンティティを生成することです。
  • マッピングも定義するメタデータ モデル (EDMX) に基づいています (ただし、最初はコードに存在しないことはほぼ間違いありません)。EDMX は、データベース構造、エンティティ構造、およびそれらの間のマッピングを含む XML モデルであり、Visual Studio に組み込まれたデザイナーによってサポートされます。コード ファーストでは、マッピングは EDMX ではなくコードで定義されます。
  • 複数のデータベース テクノロジをサポートしています (MySql と Oracle を使用しました)。
  • T4 コード生成 (v4) に基づいており、興味深い拡張性シナリオを可能にするだけでなく、以下を生成できます。
    • Entity Framework 固有の基本クラスから派生したエンティティ (EntityObject)
    • Entity Framework にまったく依存しない POCO エンティティ
    • 自己追跡エンティティ。
  • RIA サービス (Silverlight) とうまく連携します。
  • 私が考えるほとんどすべての関係タイプと、複数の戦略による継承をサポートしています (ただし、それらのいくつかにはいくつかの問題があるかもしれません)。
  • Linq (Linq to Entities) の非常に優れたサポート。

私が使ったことのない LLBLGen もありますが、私の同僚の 1 人のコメントによると、それほど優れたものではありません。

私は以前、NHibernate を簡単に使用したことがあり、その印象は良好でした。当時は今ほど成熟していませんでしたが、それでも非常に優れたライブラリでした。今、NH と EF のどちらかを選択する必要があるかどうかはわかりません... EF を使用すると思います。なぜなら、それは私が昨年ほど使用していたものであり、開発がより速く進むからです (私だけの場合)。 -wise NH の方が少し良いかもしれません。

于 2010-09-15T22:14:53.310 に答える
1

また、いくつかの ORM ツールを評価しています。私は自分の経験についていくつかのブログを書きました。それはあなたを助けるかもしれません

http://nileshgule.blogspot.com/2010/09/entity-framework-part-2-comparison.html

http://nileshgule.blogspot.com/2010/09/nhibernate-code-first-approach-with.html

http://nileshgule.blogspot.com/2010/08/entity-framework-hello-world.html

于 2010-09-17T17:32:58.740 に答える
1

正直なところ、ある程度まともな ORM であれば、データベース ファーストとコード ファーストの両方の設計を処理できます。

質問に含まれるすべての ORM (EF 4 および LLBLGen Pro 3 を含む) はいずれかを実行できますが、さまざまな量の苦痛が生じる可能性があります。たとえば、LinqToSql のコードを最初に実行することは、実際には意図したことではありませんが、その機能が「追加」されたオープン ソース プロジェクトがあると思います。とは言うものの、Microsoft が代わりに Entity Framework を推奨していることを考えると、LinqToSql を推奨する正当な理由は基本的にありません。

現時点では、NHibernate がおそらく全体的なコード ファースト ストーリーで最高です。どの ORM がデータベースの最初のストーリー全体で最も優れているかについて意見を出すのは難しいです.ORM はすべてそれをほぼサポートしており、その特定のユースケースは実際には決定の基礎とすべきものではありません.

良い ORM であるかどうかに基づいて ORM を選択します。優れた ORM は、データベース ファーストとコード ファーストの両方を適切にサポートします。

于 2010-09-16T11:32:53.187 に答える