nhibernate - 在更新父级时复制新的子记录插入

时间:2011-02-22 18:00:58

标签: nhibernate parent-child

类别和子类别具有1对多的关系。在类别的更新模式中,我想删除所有现有的子类别并重新插入新的子类别(如场景所要求的那样)。删除工作正常,但新的子记录正在重复(如果我有2个新的儿童记录,操作正在插入2 + 2条记录)

ISession session = NHibernateHelper.GetCurrentSession().GetSession(EntityMode.Poco);
        using (var tx = session.BeginTransaction())
        {
            List<Vtsubcategory> oovtsc = new List<Vtsubcategory>();
            oovtsc = oVtcategory.FkTocategory.Where(e => e.IdvtSubCategory != 0).ToList();
            foreach (Vtsubcategory ooVtsubcategory in oovtsc)
            {
                oVtcategory.FkTocategory.Remove(ooVtsubcategory);
                session.Delete(ooVtsubcategory);
            }
            session.SaveOrUpdateCopy(oVtcategory);
            session.Flush();
            if (tx.IsActive)
            {
                tx.Commit();
            }
        }

我猜它是在保存模式下插入子记录(对于Child,因为它们是新的)并在更新(父)模式下插入2个。不确定这是否属实以及如何解决它。

映射是

<class name="Vtcategory" table="`vtcategory`" lazy="false">
<id name="IdvtCategory" column="`idvtCategory`" type="int">
  <generator class="native" />
</id>
<property type="string" length="100" name="Catname" column="`catname`" />
<property type="string" length="45" name="Catshortname" column="`catshortname`" />
<property type="DateTime" name="Crdt" column="`crdt`" />
<property type="string" length="45" name="Crby" column="`crby`" />
<bag name="FkTocategory" inverse="false" lazy="true" cascade="all">
  <key column="`catid`" />
  <one-to-many class="AMSDAL.Vtsubcategory,AMSDAL" />
</bag>

  <class name="Vtsubcategory" table="`vtsubcategory`" lazy="false">
<id name="IdvtSubCategory" column="`idvtSubCategory`" type="int">
  <generator class="native" />
</id>
<property type="string" length="100" name="Subcatname" column="`subcatname`" />
<property type="string" length="45" name="Subcatshortname" column="`subcatshortname`" />
<property type="DateTime" name="Crdt" column="`crdt`" />
<property type="string" length="45" name="Crby" column="`crby`" />
<many-to-one name="Catid" cascade="none" column="`catid`" />

2 个答案:

答案 0 :(得分:0)

您需要将关系的一侧标记为反向。这通常是一对多的一方:

<bag name="FkTocategory" inverse="true" lazy="true" cascade="all">
    <key column="`catid`" />
    <one-to-many class="AMSDAL.Vtsubcategory,AMSDAL" />
</bag>

答案 1 :(得分:0)

将行李上的级联标记为all-delete-orphan而不是all。然后在您的代码中,您可以将具有新子类别的新列表分配给FkToCategory属性。这将确保NHibernate自动删除所有孤立的子类别。