1

データベースにアクセスするための最良の戦略を決定しようとしています。これは一般的な質問であり、唯一の適切な答えがないことは理解していますが、探しているものに関するガイドラインをいくつか提供します。ここ数年、私たちは独自の永続化フレームワークを使用してきましたが、これも限定的ではありますが同様に機能しています。ただし、いくつかの大きな改善が必要であり、そのようにするか、既存のフレームワークのいずれかを使用する必要があるかどうか疑問に思っています。私が探している基準は、重要な順に次のとおりです。

  1. クライアント コードは、データベースの知識がなくても、クリーンなオブジェクトで動作する必要があります。カスタム フレームワークを使用する場合、クライアント コードは次のようになります。

    SessionManager セッション = 新しい SessionManager(); オーダー order = session.CreateEntity(); order.Date = DateTime.Now; // その他のプロパティを設定します OrderDetail detail = order.AddOrderDetail(); detail.Product = 製品; // その他のプロパティ

    // 今すぐすべての変更をコミットします session.Commit();

  2. できるだけシンプルで、「柔軟性がありすぎない」必要があります。ほとんどのことを行うには、単一の方法が必要です。

  3. オブジェクト指向プログラミングを適切にサポートする必要があります。1 対多および多対多の関係を処理し、継承を処理し、遅延読み込みをサポートする必要があります。
  4. 構成は、XML ベースであることが望ましいです。

私の現在の知識では、次のオプションがあります。

  1. 現在のフレームワークを改善する - 問題は、かなりの労力が必要なことです。
  2. ADO.NET Entity Framework - よく理解していませんが、複雑すぎてレビューが悪いようです。
  3. LINQ to SQL - オブジェクト指向のプラクティスを適切に処理できません。
  4. nHibernate - 良いオプションのようですが、古いエラーが多すぎると報告するユーザーもいます。
  5. SubSonic - 簡単な紹介からすると、柔軟性が高すぎるように思えます。私はそれを望んでいません。

何を提案しますか?

編集:

精巧な答えをありがとうクレイグ。カスタム フレームワークについて詳しく説明すると、さらに役立つと思います。似たようなものを探しています。カスタム フレームワークの仕組みは次のとおりです。

  1. これは DataSet に基づいているため、最初に DataSet を構成し、そこに必要なクエリを記述します。
  2. DataSet テーブルをオブジェクトにマップする方法を指定し、それらの間の関連付けも指定する XML 構成ファイルを作成します (すべての種類の関連付けをサポートします)。3. カスタム ツールが XML 構成を解析し、必要なコードを生成します。4.生成されたクラスは、共通の基本クラスから継承します。

フレームワークと互換性を持たせるには、データベースが次の基準を満たしている必要があります。

  1. 各テーブルには、主キーとして 1 つの列が必要です。
  2. すべてのテーブルには、クライアントで生成された同じデータ型の主キーが必要です。
  3. 継承を処理するために、単一テーブルの継承のみがサポートされています。また、XML ファイルは、ほとんどの場合、何かを達成するための単一の方法を提供します。

私たちが今サポートしたいのは:

  • DataSet から依存関係を削除します。SQL コードは自動的に生成されますが、フレームワークはスキーマを生成しません。DB スキーマを手動で制御したい。
  • 継承階層のより強力なサポート。
  • オプションの LINQ との統合。

私が探しているものがより明確になったことを願っています。

4

5 に答える 5

2

現在のフレームワークを改善する - 問題は、かなりの労力が必要なことです

あなたの質問では、他の多くの場所から利用できる機能を書き直す必要がある理由を説明していません。質問で指定していない ORM に対する独自のニーズがない限り、ORM を再発明することは時間の有効な使い方ではないことをお勧めします。

ADO.NET エンティティ フレームワーク

私たちは、実世界の運用ソフトウェアで Entity Framework を使用しています。複雑?私が知る限り、他のほとんどの ORM と同じです。つまり、「かなり複雑」です。 ただし、これは比較的新しいものであり、NHibernate のようなものよりもコミュニティの経験とドキュメントが少なくなります。そのため、ドキュメントが不足しているため、より複雑に見える可能性があります。

Entity Framework と NHibernate は、オブジェクトとリレーショナルの溝を埋めるという問題に対して、明らかに異なるアプローチをとっています。これについては、このブログ投稿で詳しく説明しています。どのアプローチが自分にとって最も理にかなっているのかを検討する必要があります。

Entity Framework については、肯定的なものも否定的なものも含め、多くのコメントが寄せられています。その中には十分に根拠のあるものもあれば、他の解決策を推し進めている人々に由来するものもあります。十分に根拠のある批判には、

  • POCO サポートの欠如。これは一部のアプリケーションの問題ではなく、他のアプリケーションの問題です。POCO サポートは将来のリリースで追加される可能性がありますが、現時点で Entity Framework が提供できる最高のものは IPOCO です。
  • モノリシック マッピング ファイル。メタデータは常に流動的ではないため、これは大きな問題ではありませんでした。

しかし、いくつかの批判は、木を見て森を恋しく思うように私には思えます。つまり、オブジェクト リレーショナル マッピングの本質的な機能以外の機能について話しています。これは、Entity Framework が非常にうまく機能することが証明されています。

LINQ to SQL - オブジェクト指向のプラクティスを適切に処理できない

同意します。また、SQL Server に重点を置くのも好きではありません。

nHibernate - 良いオプションのようですが、古いエラーが多すぎると報告するユーザーもいます。

NHibernate の良いところは、その周りに非常に活気のあるコミュニティがあり、これらの難解なエラーに遭遇した場合です (信じてください、Entity Framework にも難解なエラーが発生します。それは領域に付随しているようです)。多くの場合、非常に簡単に解決策を見つけることができます。とは言うものの、エンティティ フレームワークの選択につながった評価以外に、NHibernate に関する個人的な経験はあまりありません。

SubSonic - 簡単な紹介からすると、柔軟性が高すぎるように思えます。私はそれを望んでいません。

もちろん、SubSonic は単なる ORM ではありません。SubSonic ユーザーには、SubSonic の ActiveRecord を使用する代わりに、別の ORM 実装を選択するオプションがあります。Web アプリケーション フレームワークとして、私はそれを検討します。ただし、その ORM 機能はその存在理由ではありません。SubSonic の ORM 部分は、専用の ORM フレームワークほど注目されないのではないかと疑うのは妥当だと思います。

于 2008-10-14T14:31:24.290 に答える
1

LLBLGenは、必要なことのほとんどすべてを実行する非常に優れた ORM ツールです。

于 2008-10-14T12:04:54.320 に答える
0

SQLをより細かく制御できるので、iBATISが私のお気に入りです。

于 2008-10-14T12:12:10.390 に答える
0

Castle の ActiveRecord を参照することをお勧めし ます。制作経験はありません。サンプル アプリで遊んだだけです。操作は非常に簡単に思えますが、すべての要件に適合するかどうかを知るには十分ではありません

于 2008-10-14T14:57:25.470 に答える
0

Developer Express Persistence Objects またはXPOが最もよく知られています。3年間使用しています。必要なものはすべて提供されますが、商用であり、開発のために別の (単一の会社) と提携することを除きます。それ以外では、Developer Express は、.NET プラットフォーム向けの最高のコンポーネントおよびフレームワーク プロバイダーの 1 つです。

XPO コードの例は次のとおりです。

using (UnitOfWork uow = new UnitOfWork())
{
  Order order = new Order(uow);
  order.Date = DateTime.Now();
  uow.CommitChanges();
}
于 2008-10-14T13:08:52.243 に答える