【问题标题】:NHibernate Tree structure update root problemNHibernate Tree结构更新根问题
【发布时间】:2011-02-28 09:44:49
【问题描述】:

我有一个树结构映射到这样的表中的数据库:

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,因此它失败了,因为 to 列不会接受空值。

谢谢

【问题讨论】:

    标签: c# asp.net sql nhibernate


    【解决方案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

    【讨论】:

    • 感谢您的回复,但我已经在映射中找到了答案。
    【解决方案2】:

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

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

    我已禁用父属性中的更新和插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多