类别和子类别具有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`" />
答案 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自动删除所有孤立的子类别。