【发布时间】:2014-11-10 17:37:03
【问题描述】:
我试图让 NHibernate 在一对一映射场景中保存完整的对象图。我有以下课程
public class Employee : EntityBase
{
public virtual string EmployeeNumber { get; set; }
public virtual Address ResidentialAddress {get; set; }
}
public class Address : EntityBase
{
public virtual string AddressLine1 { get; set; }
public virtual string AddressLine2 { get; set; }
public virtual string Postcode { get; set; }
public virtual string City { get; set; }
public virtual string Country { get; set; }
public virtual Employee Employee { get; set; }
}
我在这里尝试使用一对一映射,以便一名员工只有一个居住地址。我的映射如下
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Employee">
<id name="Id" generator="hilo" />
<property name="EmployeeNumber" length="10" />
<one-to-one name="ResidentialAddress" class="Address" property-ref="Employee" cascade="all" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Address">
<id name="Id" generator="hilo" />
<property name="AddressLine1"/>
<property name="AddressLine2" />
<property name="Postcode" />
<property name="City" />
<property name="Country" />
<many-to-one name="Employee" class="Employee" unique="true" />
</class>
</hibernate-mapping>
我正在使用以下代码来保存员工对象的实例
using (var transaction = Session.BeginTransaction())
{
id = Session.Save(new Employee
{
EmployeeNumber = "123456789",
ResidentialAddress = new Address
{
AddressLine1 = "Address line 1",
AddressLine2 = "Address line 2",
Postcode = "postcode",
City = "city",
Country = "country"
}
});
transaction.Commit();
}
在上述情况下,Address back to Employee 上的外键始终为空。但是,如果我更改 Employee 类上的 RResidentialAddress 属性,以便始终正确填充 Employee 属性,如下所示
private Address address;
public virtual Address ResidentialAddress
{
get { return address; }
set
{
address = value;
if (value != null) value.Employee = this;
}
}
这使它完美地工作。为什么我必须设置ResidentialAddress.Employee?我在映射中遗漏了什么吗? NHibernate 是否应该不自动保存完整的对象图(并因此确定正确的外键值)。
上面的工作代码与我有关,因为在从数据库加载实体期间从 NHiberante 调用它可能会产生问题。
【问题讨论】:
-
在地址映射上尝试
标签: nhibernate nhibernate-mapping