3

私は現在、3 つの異なる種類のビジネスのデータを保持するテーブルを含むブラウンフィールド データベースを使用しています。これは、SalesOrders と orderlines に関係しています。古いアプリケーションでは、各販売注文に 3 種類の注文行 (製品、時給、テキスト行) を追加できました。15 年前、これは Delphi で簡単なクエリを取得して 1 つのデータグリッド内のすべての行を取得するための迅速かつ汚いソリューションでした。毎日

現在、NHibernate を使用して C# でオブジェクト モデルを構築しようとしています。これらの 3 つの線種には実際のビジネス論理接続がないため、基本クラスなしで 3 つの別個のエンティティを作成しました。ただし、これらの 3 つのタイプを 1 つのリストにまとめて、注文できるようにしたいと考えています。

テーブルが要件を満たしているため、継承、クラスごとのテーブルの使用を検討しました(null以外の制約を持つ列はありません)。ただし、タイプごとのビジネスはまったく異なるため、これは論理的なステップではありません (共通するのは、userId、説明、およびコメントのみです)。もしかしてコンポーネント?しかし、基本クラスやテーブル名以外のリンクなしで、プロパティを3つの異なるクラスにマップする方法は?

皆さんが私が書いたことを理解してくれることを願っています。私はまだ実際のコードを持っていません。このコードの扱い方を紙にスケッチしているだけです。

ここに誰か助けてくれる人はいますか?

よろしく、テッド

4

1 に答える 1

6

3 つのエンティティにインターフェイスを配置し、それを基本クラスとしてすべて同じテーブルにマップできます。

interface IWhatever 
{
  // central Id for the whole table
  int Id { get; set; }
  // may be some more properties
}

class Product : IWhatever
{
  // ...
}

class HourlyRate : IWhatever
{
  // ...
}

class TextLines : IWhatever
{
  // ...
}

マッピング:

<class name="IWhatever" table="MyBigTable">

  <id .../>
  <discriminator column="Type"/>
  <subclass name="Product" discriminator-value="P">
    <!-- ... -->
  </subclass>
  <subclass name="HourlyRate" discriminator-value="HR">
    <!-- ... -->
  </subclass>
  <subclass name="TextLines" discriminator-value="TL">
    <!-- ... -->
  </subclass>
</class>
于 2011-04-29T11:43:18.367 に答える