1

多くの列を共有する 3 つのテーブルがあるので、継承を使用してそれらをマッピングし、データ レイヤーをもう少し OOP や DRY などにすることを考えました。NHibernate マニュアル (クラス階層ごとのテーブル、サブクラスごとのテーブル、具体的なクラスごとのテーブル) に記載されている継承マッピングの 3 つの戦略のすべてで、スーパークラス (または共通インターフェイス) は、すべての派生サブクラスに共通の ID でマップされます。しかし、私のテーブルの主キー列はどれも同じと呼ばれていません。これをどのようにマッピングできますか?

図では:

TAXTYPE_1

  • clcpnd -> 別の名前の Id 列
  • clcnmb -> 共通だが異なる名前の列
  • clcprc -> このテーブルに固有の特定の列

TAXTYPE_2

  • rndind -> 別の名前の Id 列
  • rndmb -> 共通だが異なる名前の列
  • rndorc -> このテーブルに固有の特定の列

TAXTYPE_3

  • dasfnd -> 別の名前の Id 列
  • dastmb -> 共通だが異なる名前の列
  • dascrc -> このテーブルに固有の特定の列

(はい、私の列はそのように命名されています。古いシステムです。変更できません。今すぐ私を殺してください)

編集:スキーマをより明確にしました。また、私の主張をもう少し明確にしたいと思います。3 つのテーブルは同じ型であり、共通のフィールドを実装するスーパータイプを抽象化し、詳細を各サブクラスに書き込めるようにしたいと考えています。したがって、TaxType クラスと、TaxType1、TaxType2、および TaxType3 サブクラスがあり、それぞれが「TaxType」です。また、これにより、単一の TaxType リポジトリなどでクエリを実行するため、他のレイヤーが使いやすくなります。質問がどれほどひどいものだったかを気づかせてくれた Jamie Ide に感謝します。

4

2 に答える 2

1

オブジェクトはプロパティを共有するため、継承を使用するのはよくある間違いです。継承は、オブジェクトが動作を共有している場合、および/または「is-a」関係 (車が乗り物であるなど) を持っている場合に適しています。また、オブジェクトを照会する方法も検討してください。基本クラスを照会して、NHibernate に派生クラスを返す必要がありますか?

あなたの場合、インターフェースがより良い選択かもしれません。これにより、実際の列にアクセスする Id という名前のプロパティを定義できるため、異なる名前の Id 列も解決されます。

public interface IMyEntity
{
    int Id { get; set; }
}

public class MyClass : IMyEntity
{
    public int Clcnmb { get; set; }
    public int Id
    { 
        get { return Clcnmb; }
        set { Clcnmb = value; }
    }
}
于 2012-12-07T12:59:33.447 に答える
1

コメントで説明されているように: ここでの問題は、既存のID 生成戦略です。(eg ) の1 つのはすべてのテーブルで使用できますが、継承のための NHibernate メカニズムは使用できませんID1

基本の抽象クラスTaxTypeには、各インスタンスを区別するために、そのサブタイプ間で一意の ID が必要です。

于 2012-12-08T16:10:08.040 に答える