我有两节课。一个称为Employee
,另一个EmployeeDetails
与其父'Employee'
类具有零或一个关系。换句话说,在某些情况下我们需要将额外的数据存储到此'EmployeeDetails'
类中,但这不一定是常态。 db结构非常简单,“EmployeeDetails”与其父级共享相同的ID。
我遇到的问题是从'EmployeeDetails'
类删除'Employee'
类,我原以为将对象设置为null将完成技巧和刷新会话但是记录在DB未被删除。
我的映射是......
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="StudioBusinessLayer.Data.Structure.Employee, StudioBusinessLayer" table="tblEmployee" lazy="false">
<id name="ID" column="ID" type="int">
<generator class="native" />
</id>
<property name="Name" column="Name" not-null="true" type="string" length="100" />
<!-- etc -->
<one-to-one constrained="false" name="EmployeeDetails" class="StudioBusinessLayer.Data.Structure.EmployeeDetails, StudioBusinessLayer" cascade="all-delete-orphan" />
</class>
</hibernate-mapping>
...以及EmployeeDetails类......
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="StudioBusinessLayer.Data.Structure.EmployeeDetails, StudioBusinessLayer" table="tblDetails" lazy="false">
<id name="ID" column="DetailsID" type="int">
<generator class="foreign">
<param name="property">Employee</param>
</generator>
</id>
<property name="Address" column="Address" not-null="false" type="string" length="1000" />
<property name="ContactEmail" column="ContactEmail" not-null="false" type="string" length="255" />
<property name="ContactName" column="ContactName" not-null="false" type="string" length="255" />
<property name="ContactTelephone" column="ContactTelephone" not-null="false" type="string" length="255" />
<property name="ZipCode" column="ZipCode" not-null="true" type="string" length="100" />
<many-to-one name="Employee" class="StudioBusinessLayer.Data.Structure.Employee, StudioBusinessLayer" column="DetailsID" insert="false" update="false"></many-to-one>
</class>
</hibernate-mapping>
插入和更新工作正常,但我一直在努力找到使其适用于删除的开关。
感激地收到任何帮助或建议......
答案 0 :(得分:2)
不幸的是,NHibernate中的一对一关系不支持all-delete-orphan。有关详细信息,请参阅此issue或此SO question。似乎除了你自己删除EmployeeDetails或使用一个模拟all-delete-orphan进行一对一的事件监听器之外别无他法。
答案 1 :(得分:0)
EmployeeDetails映射看起来不正确。看起来像Employee的多对一映射也应该是一对一的,但我没有看到tblDetails有一个Employee.Id值的列。如果没有它,你就无法为NHibernate中的删除逻辑建立双向关联,以了解哪个tblDetails行属于哪个Employee。
更新:
我找到了一个good sample来了解如何映射一对一的关系,但它是针对严格的一对一场景。它确实提到需要检查子表以确定是否存在关联,因此它可能适用于此处,但可能涉及对您的代码进行一些手动检查。