NHibernate树结构更新根问题

时间:2011-02-28 09:44:50

标签: c# asp.net sql nhibernate

我有一个树结构映射到表中的数据库,如下所示:

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

这是一张旧桌子,我不能改变它,所以忍受我...

NodeUID是GUID。

ParentUID列映射到另一行的NodeId。

根节点在其ParentUID列中的值为“0”。

我正在尝试使用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列更新为null,因此它会失败,因为列不会接受null。

感谢

2 个答案:

答案 0 :(得分:1)

您可以为该表创建触发器吗?如果是,您可以创建一个在更新/插入之前触发的触发器。类似的东西:

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 write value = NULL when ID < 0

答案 1 :(得分:1)

我找到了正确的映射,这是我的树的映射。

<?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属性。