nHibernate存储一个对象,自我引用许多孩子和许多父母

时间:2010-06-09 05:06:25

标签: c# nhibernate-mapping mapping parent-child

我有一个名为MyItem的对象,它引用同一项目中的子对象。如何设置nhibernate映射文件来存储此项?

public class MyItem
{
    public virtual string Id {get;set;}
    public virtual string Name {get;set;}
    public virtual string Version {get;set;}
    public virtual IList<MyItem> Children {get;set;}    
}

所以粗略的hbm.xml将是:

<class name="MyItem"  table="tb_myitem">
  <id name="Id" column="id" type="String" length="32">
     <generator class="uuid.hex" />
  </id>
  <property name="Name"     column="name" />
  <property name="Version"  column="version" />
  <bag name="Children" cascade="all-delete-orphan" lazy="false">
     <key column="children_id" />
     <one-to-many class="MyItem" not-found="ignore"/>
  </bag>      
</class>

这不行,我不认为。也许我需要创建另一个类,比如MyItemChildren并将其用作Children成员,然后在该类中进行映射?

这意味着有两张桌子。一个表包含MyItem,另一个表包含我的项目的引用。注意:子项可能有很多父母。

1 个答案:

答案 0 :(得分:0)

我的工作是急切地加载对象。

我可以加载'MyItem'对象,也可以加载子对象(Dependent)'MyItem'对象。

以下是我的C#类

using Iesi.Collections.Generic;

namespace Sample
   {
   public class MyItem
      {
      public virtual string Id { get; set; }
      public virtual string Name { get; set; }
      public virtual string Version { get; set; }

      public virtual ISet<MyItem> Dependants { get; set; }

      }
   }

受抚养人是依赖父母的子女集合。每个MyItem都有许多MyItem孩子。这些存储在IESI ISet&lt;&gt;。

hibernate映射文件是:

   <class name="Sample.MyItem, Sample" table="myitem">
      <id name="Id" column="id" type="String" length="32">
         <generator class="uuid.hex" />
      </id>

      <property name="Name"     column="name"     type="String" length="80"/>
      <property name="Version"  column="version"  type="String" length="25"/>

      <set name="Dependants" table="myitemhierarchy" >
         <key column="parentid" />
         <many-to-many class="Sample.MyItem, Sample" column="childid" />
      </set>
   </class>

这篇文章帮助极大: http://web.archive.org/web/20090806071731/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/05/14/how-to-map-a-tree-in-nhibernate.aspx