18

各方法の長所/短所は何ですか?

本またはこのサイトのどこかで、Entity Framework 4 でテーブルの継承を使用するのが不適切な理由を読んだことがあります。

たとえば、entityId、datecreated、datemodified を持つ 1 つのテーブルを作成し、エンティティ フレームワークで他のすべてのクラスにそれを継承させてみませんか? 次に、他のすべてのエンティティのテーブルにそれらの列を含める必要はありません。次に、人物クラスにその基本クラスを継承させ、次に特定の人物に人物を継承させることができます。

データベースを生成するための小さな SQL スクリプトを作成する以外に、これの利点についてはわかりません...

私が見る欠点は、SQLでデータを直接クエリ/表示することがお尻の大きな苦痛になることです(すべての関連情報は非常に多くのテーブルにまたがっています)。

ほとんどの経験の浅い開発者が継承を使用して問題にアプローチする場合、データベース データを変更して移行するよりも、アプリケーション コードを変更する方がはるかに簡単です。私も最初に開発を始めたときにそうしました。それは論理的に理にかなっています。しかし、長い間開発を続けると、委譲が本当に最善の方法であり (SOA の場合はサービスを呼び出すサービス)、単一目的のサービスは継承よりもはるかに多くの再利用を提供することがわかります。」

これは私にとっても理にかなっています。

そう

1) 一般に、継承と拡張の長所/短所は
何ですか? 2) 上記の私の具体的な例では、何がより適切でしょうか?
3) もし私の例がどちらか、または両方でつまらないものなら、継承と拡張を使用するための良い例は何ですか?

以前に両方を使用したことがありますが、慣れていないため、すべての状況をどのように処理すればよいかまだわかりません.

10 票、8 お気に入り、100 回以上の閲覧数で誰も拡大できませんか? =(.

4

3 に答える 3

10

私はパーティーに少し遅れましたが、EF での継承に関してあなたと同じ質問をしていて、あなたが読むのにかなり良い要約を見つけました。これは Julie Lerman の著書 Programming Entity Framework からの抜粋です。

それを読んだ後、このトピックに関する私の結論は次のとおりです。

1)一般に、継承と拡張の長所/短所は何ですか - 長所は、選択したテーブル戦略に大きく依存します。継承戦略の選択方法 - MSDN ブログ を参照してください。ただし、継承を使用することをすでに決定しているという前提での「長所」にすぎません。そして、それは軽々しく下す決定ではありません。

短所はたくさんありますが、最大のものは、既存のエンティティを派生エンティティとしてデータベースに追加できないことです。例: Person から継承する Student があります。John Smith の Person レコードがあります。しばらくして、ジョン・スミスが生徒になる必要があります。あまりにも悪い。それは可能ではありません。(少なくとも、ストアド プロシージャを使用して EF を回避する必要はありません)。

2)上記の具体例では、何がより適切でしょうか? - あなたの例では、それらの列 (entityId、datecreated、datemodified) を必要なテーブルに追加するだけです。datecreated と datemodified に複合型を使用できますが、非常に厳格な DRY の人でない限り、その必要はありません。それでも、それはやり過ぎかもしれません。その理由は、エンティティを取得すると、そのエンティティを別の派生テーブルに追加することはできなくなるためです。Person (BaseEntity) を後で Student として追加することはできません。また、LINQ クエリの作成は、必要以上に複雑になります。アレックスはすでにそれを示しました。

3)もし私の例がどちらか、または両方でつまらないものなら、継承と拡張を使用するための良い例は何ですか? - 一般に、基本型を抽象化できる場合は、継承機能する可能性があります。ただし、他のオプションを最初に検討する必要があります。基本型がどこかで直接インスタンス化される場合は、合成を使用してください。実際にレコードを照会して挿入する場合、継承は非常に面倒です。

要約すると、EF で継承を実行できるからといって、そうすべきであるとは限りません。継承のない設計で問題を解決できる場合は、ぜひそれを実行してください。

于 2011-02-26T02:22:46.797 に答える
6

私はあなたが説明するのと同じようなことを試みました、そして私が見る主な問題は、uがObjectSet<T>派生型のために作成できないということです。ObjectSet<Person>したがって、リポジトリはありません。たとえばBusinessObjectエンティティからすべてのエンティティを派生させる場合は、でのみ作業できますObjectSet<BusinessObject>。Personリポジトリのみをクエリする場合は、次のようなクエリを記述できますがContext.BusinessObjectSet.OfType<Person>().ToList()、内部では適切なSQLが生成されず、最初に完全なBusinessObject行を取得してから、メモリ内のPersonエンティティを除外します。ですから、パフォーマンスに大きな影響を与えると思います。

于 2010-11-27T18:17:20.493 に答える
3

モデルで継承を使用する場合の欠点の 1 つは、派生エンティティが現在サポートされていないため、WCF Data Services (OData) を介してモデルを表示できないことです。

于 2010-11-29T19:01:38.313 に答える