nHibernate, отношения один к нулю или одно отношение - PullRequest
5 голосов
/ 06 мая 2011

У меня есть два класса.Один называется Employee, а другой EmployeeDetails имеет нулевую или одну связь со своим родительским классом 'Employee'.Другими словами, бывают случаи, когда нам нужно хранить дополнительные данные в этом классе 'EmployeeDetails', но это не обязательно является нормой.Структура db довольно проста: у EmployeeDetails тот же идентификатор, что и у его родителя.

Проблема, с которой я столкнулся, заключается в удалении класса 'EmployeeDetails' из класса 'Employee', я бы предположил, чтоустановка объекта в 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>

Вставки и обновления работают нормально, но я изо всех сил пытался найти переключатель, который делает эту работу для удалений.

Любая помощь или предложения с благодарностью принимаются...

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

К сожалению, all-delete-orphan пока не поддерживается для отношения один-к-одному в NHibernate. См. Этот выпуск или этот SO вопрос для получения более подробной информации. Кажется, что нет другого способа, кроме как удалить EmployeeDetails самостоятельно или использовать прослушиватель событий, который будет эмулировать all-delete-orphan для одного-к-одному.

0 голосов
/ 06 мая 2011

Отображение EmployeeDetails выглядит неправильно. Похоже, что сопоставление «многие-к-одному» с Employee также должно быть взаимно-однозначным, но я не вижу, чтобы в tblDetails был столбец для значения Employee.Id. Без этого вы не сможете установить двунаправленную связь для логики удаления в NHibernate, чтобы узнать, какая строка tblDetails принадлежит какому сотруднику.

UPDATE:

Я нашел хороший пример для того, как отобразить отношения один-к-одному, но это строго для сценария один-к-одному. В нем упоминается, что дочерняя таблица должна быть проверена для определения того, существует ли связь, поэтому она может быть применима здесь, но может включать некоторую ручную проверку в вашем коде.

...