【发布时间】:2015-07-11 04:25:14
【问题描述】:
我是 NHibernate 和 C# 的新手,所以请温柔一点!
我有以下两个 NHibernate 实体:
Employee
{
private long _id;
private String _name;
private String _empNumber;
private IList<Address> _addresses;
//Properties...
}
和
Address
{
private long _id;
private String _addrLine1;
private String _addrLine2;
private String _city;
private String _country;
private String _postalCode;
//Properties
}
他们有一个从Employee到Address的one-to-many关系(每个
员工的记录中可以有多个地址)。方便地忽略
多个员工可能居住在同一地址的事实。
我从内存中对象的角度理解这一点(NHibernate 实体)。我正在努力解决的是映射文件(我正在 简单的例子在这里)。到目前为止,这是我想出的:
// Intentionally left out XML and <hibernate-mapping>
// Mappings for class 'Employee'. -->
<class name="Employee" table="Employees">
<id name="ID">
<generator class="native">
</id>
<property name="Name" />
<property name="EmpNumber" />
<bag name="Addresses">
<key column="AddressId" />
<one-to-many class="Address" />
</bag>
</class>
和
// Intentionally left out XML and <hibernate-mapping> .
// Mappings for class 'Address'
<class name="Address" table="Addresses">
<id name="ID">
<generator class="native">
</id>
// Intentionally left out name="Employee"
// as I don't have corresponding field in Address entity.
<many-to-one class="Employee" column="EmployeeID" cascade="all" />
<property name="AddrLine1" />
<property name="AddrLine2" />
<property name="City" />
<property name="Country" />
<property name="PostalCode" />
</class>
- 这是正确的吗?
- 如果不是,看来我在这里缺少的是
Address中的一个字段 实体,它是对相应Employee实体的引用。但如果 所以,那么我不明白为什么需要这样做:我不需要获取Address来自Employee,只是反过来...
【问题讨论】:
-
在我看来,如果地址表中的地址是唯一的,那么您在这里需要多对多关系而不是一对多关系。这意味着存储员工 ID 和地址 ID 的多对多表。这样,一名员工可以与一个或多个地址相关联,并且该地址可以属于超过 1 名员工。
-
@ColeW 我不希望地址属于多个员工。这是故意的。
-
如果是这样,您需要在地址表中添加一个员工 ID 以识别哪些地址属于哪些员工。因此,地址表中可能存在多个具有相同员工 ID 的地址。这就是 nhibernate 如何知道如何将
private IList<Address> _addresses;填充到Employee对象中。我还建议您将Employee对象作为Address对象的一部分,因为导航到关系的双方通常会派上用场,即使从业务逻辑的角度来看它不一定总是有意义。 -
你为什么要从地址而不是员工添加级联?
-
@ColeW a) 你能添加这个作为答案吗? b) 有没有办法在地址数据库表中添加 EmployeeID 列在
Address实体中没有Employee引用?
标签: c# nhibernate orm nhibernate-mapping