nHibernate,一对一或零关系困扰

时间:2011-05-06 13:53:45

标签: c# nhibernate nhibernate-mapping

我有两节课。一个称为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>

插入和更新工作正常,但我一直在努力找到使其适用于删除的开关。

感激地收到任何帮助或建议......

2 个答案:

答案 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来了解如何映射一对一的关系,但它是针对严格的一对一场景。它确实提到需要检查子表以确定是否存在关联,因此它可能适用于此处,但可能涉及对您的代码进行一些手动检查。