0

レガシー データベースをマップしようとしています。私は、識別器であるべきだと私が信じているものを実装する必要があります。私の問題は、差別化する列または現在の行に数式がある場合にのみ、ディスクリミネーターが機能するように見えることです。私の場合、実際の差別化要因はありません。データは、存在する場合は 1 つのテーブルに結合され、存在しない場合は他のテーブルに結合されます。さらに複雑にするために、テーブルは複合キーを使用します。以下に例を示します (私が作成しているため、単純化しすぎている可能性があります)。

私のコードを考えると

public class SomeTable {
  public virtual int DataID { get; set; }
  public virtual int EmployeeOrCustomer { get; set; }
  public virtual Person Person { get; set; }
  public virtual int SomeValue { get; set; }
}

public abstract class Person {
  public virtual int ID { get; set; }
  public virtual string Name { get; set; }
}

public class Employee : Person {
  public virtual int EmployeeNumber { get; set; }
}

public class Customer : Person {
  public virtual int CustomerNumber { get; set; }
}

そして私のデータ

-SomeTable-
DataID(K)  EmployeeOrCustomer(K)  SomeValue
     1                      1           100
     1                     22           222

-Employee-
ID            Name      EmployeNumber
 1        Joe Blow              12345

-Customer-
ID             Name    CustomerNumber
22        ACME Inc.              4242

私のマッピング:

<class name="SomeTable" abstract="true">
  <composite-id>
    <key-property name="DataID" />
    <key-property name="EmployeeOrCustomer" />
  </composite-id>
  <property name="SomeValue" />
  <!--   ?????? -->
</class>
<class name="Employee">
  <id name="ID" />
  <Property name="EmployeeNumber">
</Class>
<class name="Customer">
  <id name="ID" />
  <Property name="CustomerNumber">
</Class>

私が期待すること

DataID: 1,  SomeValue: 100  Person: { Employee: EmployeeNumber: 12345 }
DataID: 1,  SomeValue: 222, Person: { Customer: CustomerNumber: 4242 }

2 つのテーブルを結合し、マージされたテーブルを結合として使用することを考えましたが、2 つのテーブルは大きく異なります。また、スキーマを変更できないため、識別子列を追加することはできません。

何か案は?

4

1 に答える 1

1

あなたが探しているのは、ユニオンサブクラスの継承マッピングだと思います

<class name="Person" abstract="true">
  <id name="Id">
    <generator class="assigned"/>
  </id>

  <union-subclass table="Employee" name="Employee">
    <property name="Name"/>
    <property name="EmployeeNumber"/>
  </union-subclass>

  <union-subclass table="Customer" name="Customer">
    <property name="Name"/>
    <property name="CustomerNumber"/>
  </union-subclass>
</class>

<class name="SomeTable" abstract="true">
  <composite-id>
    <key-property name="DataID" />
    <key-many-to-one name="Person" column="EmployeeOrCustomer" />
  </composite-id>
  <property name="SomeValue" />
</class>

追加のプロパティEmployeeOrCustomerは必要ないことに注意してください。

于 2013-02-13T19:12:34.887 に答える