Проблема с корнем обновления древовидной структуры NHibernate - PullRequest
2 голосов
/ 28 февраля 2011

У меня есть древовидная структура, сопоставленная с базой данных в таблице следующим образом:

UID numeric(18, 0)
NodeUID varchar(50)
Text    nvarchar(50)
TreeLevel   int
ParentUID   varchar(50)
OrderInLevel    int
IsLeaf  bit

Это старая таблица, и я не могу ее изменить, так что терпите меня ...

NodeUID - это GUID.

столбец ParentUID сопоставлен с NodeId другой строки.

Корневой узел имеет значение "0" в столбце ParentUID.

Я пытаюсь отобразить дерево с помощью NHibernate следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core" table="bDoxTreeNodes" lazy="false" schema="bDox.dbo">
      <id name="NodeUId">
        <column name="NodeUID"/>
        <generator class="assigned"/>
      </id>
      <property name="Text">
          <column name="Text"/>
      </property>
      <property name="TreeLevel">
          <column name="TreeLevel"/>
      </property>
      <property name="IsLeaf">
          <column name="IsLeaf"/>
      </property>

      <many-to-one name="Parent" class="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core" column="ParentUID" not-found="ignore"/>

      <bag name="Children" lazy="false" order-by="OrderInLevel ASC" cascade="all-delete-orphan" inverse="true">
        <key column="ParentUID"/>
        <one-to-many class="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core" />
      </bag>
    </class>
</hibernate-mapping>

Дело в том, что когда я пытаюсь обновить узел (а корневой узел указывает на него), свойство Parent имеет значение null, и поэтому NHibernate пытается обновить столбец ParentUID до нуля, и поэтому он не выполняется, так как столбец не принять ноль.

спасибо

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Я нашел правильное отображение, которое работает, вот отображение для моего дерева.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core" table="TreeNodes" lazy="false" >
      <id name="NodeID">
        <column name="NodeUID"/>
        <generator class="assigned"/>
      </id>
      <property name="Text">
          <column name="Text"/>
      </property>
      <property name="TreeLevel">
          <column name="TreeLevel"/>
      </property>
      <property name="ParentID" >
          <column name="ParentUID" />
      </property>
      <property name="IsLeaf">
          <column name="IsLeaf"/>
      </property>

      <many-to-one name="Parent" class="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core" column="ParentUID"  not-found="ignore"  update="false" insert="false"/>

      <bag name="Children" lazy="false" order-by="OrderInLevel ASC" inverse="true" cascade="all-delete-orphan">
        <key column="ParentUID"/>
        <one-to-many class="BasicFW.Core.Domain.NavigationTree.UsersNavigationTreeNode, BasicFW.Core"/>
      </bag>
    </class>
</hibernate-mapping>

Я отключил обновление и вставил в свойство Parent.

1 голос
/ 28 февраля 2011

Можете ли вы создать триггер для этой таблицы?Если да, вы можете создать триггер, который срабатывает перед обновлением / вставкой.Что-то вроде:

create trigger TreeNode_before before insert, update
on TreeNode
referencing NEW as _new
for each row
begin
if _new.ParentUID is null then
    set _new.ParentUID = '0';
end if;
end;

Редактировать: альтернативой будет использование перехватчика.Я сам этим не пользовался, но в соответствии со следующим вопросом это должно работать и в вашем случае. Значение записи NHibernate = NULL, когда идентификатор <0 </a>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...