NHibernate - 将同一实体映射到同一数据库中的不同表

时间:2009-02-16 19:00:15

标签: nhibernate nhibernate-mapping

假设我们有一个Employee实体,由一些其他实体组成,例如一对多地址和联系人,以及一些字段(名称,年龄等)。我们将此实体映射出来并且可以正常使用它,将每个部分保存到“Employee”,“EmployeeAddresses”和“EmployeeContacts”表中。

但是,我们使用这个员工的大部分信息进行大量计算,并且有一个单独的“EmployeeInput”对象,该对象由相同的Address和Contact对象列表组成(即Employee和EmployeeInputs对象都有一个Address和Contact列表实体)。我们需要在预先计算计算时保存这些信息,以便以后进行审计。我们想将此EmployeeInput实体保存到数据库中的“EmployeeInput”表中。

我们遇到的问题是如何保存地址和联系人列表?我们希望将它们添加到“EmployeeInputAddresses”和“EmployeeInputContacts”之类的内容中,但地址和联系人entites已分别映射到“EmployeeAddresses”和“EmployeeContacts”。

如果不创建新的“EmployeeInputAddress”和“EmployeeInputContact”实体并为每个实体创建单独的映射文件(因为字段将逐个重复),最简单的方法是什么。换句话说,我们如何根据它所属的父对象将单个实体Address映射到两个不同的表(如果从Employee对象保存,则为EmployeeAddresses表,如果从EmployeeInput对象保存,则为EmployeeInputAddresses表)。 / p>

1 个答案:

答案 0 :(得分:5)

最简单的方法是将地址和联系人映射为复合元素。这样,您可以针对EmployeeEmployeeInput以不同方式映射您的集合,因为映射由容器拥有。

例如:

public class Employee
{
    public List<Address> Addresses{get; set;}
}


public class EmployeeInput
{
    public List<Address> Addresses{get; set;}
}

public class Address
{
    public string Street{get;set;}
    public string City{get; set;}
}

会有映射映射:

<class name="Employee" table="Employees">
    <id name="id">
        <generator class="native"/?
    </id>
    <list name="Addresses" table="EmployesAddresses">
        <key column="Id" />
        <index column="Item_Index" />
        <composite-element class="Address">
            <property name="Street" />
            <property name="City" />
        </composite-element>
    </list>
</class>

<class name="EmployeeInput" table="EmployeesInput">
    <id name="id">
        <generator class="native"/?
    </id>
    <list name="Addresses" table="EmployeesInputAddresses">
        <key column="Id" />
        <index column="Item_Index" />
        <composite-element class="Address">
            <property name="Street" />
            <property name="City" />
        </composite-element>
    </list>
</class>