使用可能的鉴别器映射遗留数据库

时间:2013-02-10 16:32:39

标签: nhibernate

我正在尝试映射旧数据库。我需要实施我认为应该成为歧视者的东西。我的问题是鉴别器似乎只在有一个要区分的列或当前行的公式时才起作用。对于我的情况,没有实际的区分因素,如果数据存在则数据连接到一个表,如果不存在,则连接到另一个表。为了使事情变得更复杂,该表使用复合键。 这是一个例子(在我编写时可能过于简单了):

鉴于我的代码

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个表有很大不同。此外,我无法修改架构,因此添加鉴别器列不是一种选择。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为你要搜索的是union子类继承映射

<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