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

4 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表).

小智 5

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

例如:

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;}
}
Run Code Online (Sandbox Code Playgroud)

会有映射映射:

<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>
Run Code Online (Sandbox Code Playgroud)