nhibernate - дублирует вставку новой дочерней записи при обновлении родительской - PullRequest
0 голосов
/ 22 февраля 2011

Категория и подкатегория имеют отношение 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();
            }
        }

Я полагаю, это вставка дочерних записей вРежим сохранения (для ребенка как новый) и вставка еще 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 голосов
/ 23 февраля 2011

Отметьте каскад на сумке как all-delete-orphan, а не all.Затем в своем коде вы можете просто назначить новый список с новыми подкатегориями свойству FkToCategory.Это обеспечит автоматическое удаление всех потерянных подкатегорий NHibernate.

0 голосов
/ 22 февраля 2011

Вам необходимо пометить одну сторону отношений как обратную. Обычно это одна сторона на один ко многим:

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