假设我们有一个 Employee 实体,它由一些其他实体组成,例如一对多的地址和联系人,以及一些字段(姓名、年龄等)。我们映射了这个实体并且可以很好地使用它,将每个部分保存到“Employee”、“EmployeeAddresses”和“EmployeeContacts”表中。
然而,我们几乎使用所有员工的信息进行大计算,并有一个单独的“EmployeeInput”对象,由相同的 Address 和 Contact 对象列表组成(即 Employee 和 EmployeeInputs 对象都有一个 Address 和 Contact 实体的列表)。当我们为以后的审计目的进行计算时,我们需要保存这些信息。我们想将此 EmployeeInput 实体保存到数据库中的“EmployeeInput”表中。
我们遇到的问题是如何保存地址和联系人列表?我们想将它们粘贴到“EmployeeInputAddresses”和“EmployeeInputContacts”之类的东西中,但地址和联系人实体已经分别映射到“EmployeeAddresses”和“EmployeeContacts”。
在不创建新的“EmployeeInputAddress”和“EmployeeInputContact”实体并为每个实体创建单独的映射文件的情况下完成此操作的最简单方法是什么(因为这些字段实际上会被逐个复制)。换句话说,我们如何根据它所属的父对象将单个实体 Address 映射到两个不同的表(EmployeeAddresses 表,如果它是从 Employee 对象保存的,而 EmployeeInputAddresses 表,如果它是从 EmployeeInput 对象保存的)。
最佳答案
最简单的方法是将地址和联系人映射为复合元素。这样你就可以为 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;}
}
会有以下映射:
<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>
关于NHibernate - 将同一实体映射到同一数据库中的不同表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554200/