Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# nHibernate,一对零或一对一的关系问题_C#_Nhibernate_Nhibernate Mapping - Fatal编程技术网

C# nHibernate,一对零或一对一的关系问题

C# nHibernate,一对零或一对一的关系问题,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我有两节课。一个名为Employee,另一个名为EmployeeDetails,它与其父“Employee”类的关系为零或一。换句话说,在某些情况下,我们需要将额外的数据存储到这个“EmployeeDetails”类中,但这并不一定是标准。db结构非常简单,“EmployeeDetails”与其父项共享相同的ID 我遇到的问题是从'Employee'类中删除'EmployeeDetails'类,我会想象将对象设置为null会完成技巧和刷新会话,但数据库中的记录不会被删除 我的映射是 <?x

我有两节课。一个名为
Employee
,另一个名为
EmployeeDetails
,它与其父
“Employee”
类的关系为零或一。换句话说,在某些情况下,我们需要将额外的数据存储到这个
“EmployeeDetails”
类中,但这并不一定是标准。db结构非常简单,“EmployeeDetails”与其父项共享相同的ID

我遇到的问题是从
'Employee'
类中删除
'EmployeeDetails'
类,我会想象将对象设置为null会完成技巧和刷新会话,但数据库中的记录不会被删除

我的映射是

<?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>

雇员
插入和更新可以很好地工作,但我一直在努力寻找使其能够用于删除的开关


感谢您的帮助或建议……

EmployeeDetails映射看起来不正确。似乎到Employee的多对一映射也应该是一对一的,但我看不到TBLDeails中有Employee.Id值的列。没有它,您就无法为NHibernate中的删除逻辑建立双向关联,以了解哪个tblDetails行属于哪个员工

更新:


我找到了一个关于如何映射一对一关系的方法,但它适用于严格的一对一场景。它确实提到需要检查子表以确定关联是否存在,因此它可能适用于此处,但可能需要在代码中进行一些手动检查。

不幸的是,NHibernate中的一对一关系还不支持所有删除孤立项。有关更多详细信息,请参见此项或此项。似乎除了自己删除EmployeeDetails或者使用一个事件监听器来模拟一对一的所有delete orphan之外,没有其他方法了。

不用担心,谢天谢地,这件事可以由业务层处理,所以尽管nHibernate的实现不是很好,但至少它已经封装好了。干杯