假设我们有一个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>
答案 0 :(得分: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;}
}
会有映射映射:
<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>