【发布时间】:2011-03-15 03:04:40
【问题描述】:
我有一个新员工的员工输入屏幕,在提交时会被员工模型绑定器拦截。一个员工有一个“业务单位”和一个“覆盖业务单位”。覆盖业务部门是最近添加的,是我的问题的原因。
这是部分员工映射:
<class name="Employee" table="Employee">
<id name="Id" column="id">
<generator class="native" />
</id>
...
<many-to-one name="BusinessUnit" class="BusinessUnit" column="businessUnitId" />
<many-to-one name="OverrideBusinessUnit" class="BusinessUnit" column="overrideBusinessUnitId" not-null="false" />
...
</class>
这是业务部门映射:
<class name="BusinessUnit" table="BusinessUnit" lazy="true">
<id name="Id" column="id">
<generator class="native" />
</id>
<property name="Description" column="description"/>
<many-to-one name="guidelineApprover" class="Employee" column="guidelineApproverId" cascade="none" fetch="join" access="field" />
<many-to-one name="increaseApprover" class="Employee" column="increaseApproverId" cascade="none" fetch="join" access="field" />
</class>
在提交表单后的员工模型绑定器中,我使用 NHibernate 从数据库中获取业务单元和覆盖业务单元。这是代码:
从模型绑定器中的数据库中获取业务部门:
string attemptedBusinessUnitId = valueProvider.GetValue(key).AttemptedValue;
Int32.TryParse(attemptedBusinessUnitId, out businessUnitId);
employee.BusinessUnit = businessUnitRepository.Get(businessUnitId);
modelState.SetModelValue(key, valueProvider.GetValue(key));
从模型绑定器中的数据库中获取覆盖业务单元:
string attemptedOverrideBusinessUnitId = valueProvider.GetValue(key).AttemptedValue;
Int32.TryParse(attemptedOverrideBusinessUnitId, out overrideBusinessUnitId);
employee.OverrideBusinessUnit = businessUnitRepository.Get(overrideBusinessUnitId);
modelState.SetModelValue(key, valueProvider.GetValue(key));
我当前的获取模式设置为“提交”。我的问题是,在我添加“覆盖业务部门”多对一并尝试执行 employeeRepository.Save(employee) 后,我开始收到以下错误:
object references an unsaved transient instance - save the transient instance before flushing.
Type: BusinessUnit, Entity: BusinessUnit
如果我在这个字段上设置 cascade="all",我只会得到另一个类似的异常,但需要保存 Employee 类型的临时实例,实体 EmployeeEmpty。谁能通过查看代码 sn-ps 告诉我如何避免此异常(最好不涉及级联)?
编辑:
employeeRepository.Save(employee) 只是调用 session.SaveOrUpdate(employee)。所以我要做的就是在分配给员工之后保存我从数据库中检索到的两个业务部门字段。
【问题讨论】:
标签: .net nhibernate hibernate