开发者

NHibernate Tree structure update root problem

开发者 https://www.devze.com 2023-02-14 08:16 出处:网络
I have a tree structure mapped to the data base in a table like this: UID numeric(18, 0) NodeUID varchar(50)

I have a tree structure mapped to the data base in a table like this:

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

It is an old table and I cannot change it so bear with me...

The NodeUID is a GUID.

the ParentUID column is mapped to the NodeId of a different row.

A root node has a value of "0" in its ParentUID column.

I am trying to map the Tree with NHibernate like this:

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

The thing is that when I try to update a node ( and a root node in specifies ) the Parent property is null and so NHibernate try`s to Update the ParentUID column to null, and so it failles since to column will not accept null.

thanks


Can you create a trigger for that table? If yes, you could perhaps create a trigger that fires before update/insert. Something like:

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;

Edit: An alternative would be using an interceptor. I have not used that myself but according to the following question it should work in your case, too.

Edit: fixed the link. NHibernate write value = NULL when ID < 0


I have found the correct mapping that worked, here is the mapping for my tree.

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

I have disabled the update and insert in the Parent property.

0

精彩评论

暂无评论...
验证码 换一张
取 消