2

我的课程:

    public class Parent
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual IList<Child> Children { get; set; }
        /* other properties */
    }

    public class Child
    {
        public virtual int Id { get; set; }
        public virtual Parent Mother { get; set; }
        public virtual int ItemNumber { get; set; }
        public virtual string Remarks { get; set; }
        /* other properties */
    }

我的数据库:

PARENTS(ID, NAME, ...) -> PRIMARY KEY = ID
CHILDREN (C_ID, MOTHER_ID, ITEM_NO, REMARKS ....) -> PRIMARY KEY = c_ID

NHibernate 映射:

  <class name="Parent" table="PARENTS">
        <id name="Id"  column="ID">
          <generator class="increment" />
        </id>
        <property name="Name" column="NAME"/>
        <list name="Children" cascade="all" inverse="true">
        <key column="MOTHER_ID" not-null="true" />
           <list-index base="1" column="ITEM_NO"/>
          <one-to-many class="Child" />
        </list>
 </class>

  <class name="Child" table="CHILDREN">
        <id name="Id"  column="C_ID">
          <generator class="increment" />
        </id>
        <many-to-one name="Mother" class="Parent" column="MOTHER_ID" />
        <property name="ItemNumber" column="ITEM_NO"/> 
        <property name="Remarks" column="REMARKS"/>
 </class>

我的代码:

Parent p = new Parent();
//set parent properties here
Child c = new Child();
//set child properties here

p.Children.add(c);
c.Mother = p;

//Save parent

问题:

上面的代码将父项以及所有子项保存在相应的表中。但是,所有子项在 ITEM_NO 字段中的默认值为零。是否有任何映射可以帮助我自动为给定父母的每个孩子从 1 开始为 ITEM_NO 分配一个递增的值?即 ITEM_NO 的序列应该从 1 重复到每个父级的子级数。

注意:我需要 Child 是一个独立的实体,所以我应该能够在不需要通过父母的情况下查询它。

4

2 回答 2

0

如果我正确理解您的问题,您必须在您的数据库中创建一个序列(参见它的描述),一个简单的示例将是(可能因数据库而异):

CREATE SEQUENCE item_no_seq START WITH 1 INCREMENT BY 1

然后稍微改变你的映射:

<id name="ItemNumber" type="integer" column="ITEM_NO">
  <generator class="sequence">
    <param name="sequence">item_no_seq</param>
  </generator>
</id>
于 2013-02-07T13:04:44.567 回答
0

我认为问题在于列表元素中的 insert="true",因为这告诉 NHibernate 设置外键是孩子的责任。而且孩子不知道列表映射。

于 2013-02-07T12:57:21.790 回答