1

私は多くのADO.NETEFプログラミングを行いましたが、オブジェクト/テーブルの1つが別のオブジェクト/テーブルから継承するプログラミングは一度もありません。

3つのテーブル(正方形、三角形、ポリゴン)を持つ既存のデータベースがあり、これらのテーブルへのLinqアクセスを許可するADO.NETモデルを追加した場合、正方形と三角形のオブジェクトがポリゴンから派生していることを確認するにはどうすればよいですか?

親テーブルの列が子クラスの列に存在するスキーマに要件はありますか?

そして、ComputeArea()のようなメソッドをオーバーライドしたい場合はどうなりますか?拡張方法を使用しますか、それともより良い方法がありますか?

私の根本的な質問は、オブジェクト指向プログラミングがORMにどのように/どこで/価値をもたらすかということですが、価値/主観的な質問はスタックオーバーフローでは推奨されないことを認識しています。

4

3 に答える 3

2

正方形と三角形のオブジェクトがポリゴンから派生していることを確認するにはどうすればよいですか?

あなたはこれをよく見てください:

SQLServerでのテーブル継承の実装

そして、ComputeArea()のようなメソッドをオーバーライドしたい場合はどうなりますか?拡張方法を使用しますか、それともより良い方法がありますか?

拡張メソッドはそのトリックを実行する必要があり、エンティティを値オブジェクトのように動作させる方がよいでしょう。

私の根本的な質問は、オブジェクト指向プログラミングがORMにどのように/どこで/価値をもたらすかということですが、価値/主観的な質問はスタックオーバーフローでは推奨されないことを認識しています。

それがまさに(ORMの)存在理由であり、オブジェクトリレーショナルマッピングと呼ばれています。つまり、それは価値をもたらします。よりクリーンなコード、記述が簡単、リファクタリングが簡単です。

そうは言っても、IMHOの欠点の1つは、ユーザーが基盤となるストレージテクニックの経験がない場合、ORMツールの使用は、必ずしもテクノロジーのためではなく、あなたのやり方のために、本来あるべきパフォーマンスを発揮できないことです。それを使用する(オブジェクト指向とリレーショナルの世界からの結合を使用する方法に関して)またはあなたがやろうとしていることのようなもの、それはそれです、継承。これらのことは、OOの世界では非常に簡単ですが、リレーショナルデータベースでは必要ありません。

于 2012-09-21T20:03:24.187 に答える
1

基本クラスから継承させることができます。両方のテーブルに同じフィールドが作成されます。列を複製したくない場合は、正方形と三角形の主キーをポリゴンオブジェクトの主キーにしてから、それらのオブジェクトに正方形/三角形固有のフィールドを設定することができます。

メソッドのオーバーライドは非常に簡単に実行できます。必ず[NotMapped]属性をその上に置いてください。

編集:これは、データ注釈付きのコードファーストの使用に適用されます。

于 2012-09-21T20:04:57.010 に答える
1

メソッド=動作と動作はオブジェクトの側面であり、データではありません。toComputeArea()は、相互ヒットやSOLID設計などの従来のOOPプリンシパルを介して維持されます。

データをオブジェクトにマッピングするには、次の2つのフレーバーがあります。

  1. クラスごとのテーブル
  2. 階層ごとのテーブル

継承のためのクイックコードスニペット

abstract class polygon
{
    abstract decimal ComputeArea();
}

class Triangle : Polygon
{
     public decimal Base {get;set;}
     public decimal Height {get;set;}

     public override decimal ComputeArea()
     {
          return Base * Height / 2;
     }
}

class class Square : Polygon
{
     public decimal Side {get;set;}

     public override decimal ComputeArea()
     {
          return Side * 4;
     }
}


class class Circle : Polygon
{
     public decimal Radius {get;set;}

     public override decimal ComputeArea()
     {
          return Math.Square(Math.Pi * Radius);
     }
}
于 2012-09-21T20:05:24.247 に答える