レガシー データベースをマップしようとしています。私は、識別器であるべきだと私が信じているものを実装する必要があります。私の問題は、差別化する列または現在の行に数式がある場合にのみ、ディスクリミネーターが機能するように見えることです。私の場合、実際の差別化要因はありません。データは、存在する場合は 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 つのテーブルは大きく異なります。また、スキーマを変更できないため、識別子列を追加することはできません。
何か案は?