在同一会话中删除并在Nhibernate中创建新的儿童收藏
我有要求删除父项目中的现有集合并插入新的集合条目。 这应该发生在同一个事务中。 请检查下面的hbm配置。 请让我知道为什么删除不会发生在下面的代码。
<class name="Category" table="Category" schema="dbo" lazy="true">
<id name="ID" access="property" column="Category_ID" unsaved-value="0">
<generator class="native">
</generator>
</id>
<property name ="CategoryName" access="property" column="Category_Name" not-null="true"/>
<bag name="Ratios" access="property" table="Ratio" inverse="true" cascade="all" lazy="true">
<key column="CategoryID" />
<one-to-many class="Category, Domain" />
</bag>
C#代码:
if (ratios!= null && ratios.Count > 0)
{
ratios= ratios.Where(a => a.ID == 0).ToList<Ratio>();
cat.Ratios = ratios;
if (cat.ID == 0)
{
_repository.Save(cat);
}
else
{
_repository.Update(cat);
}
}
请注意,这是在一个Nhibernate会话交易中。 我只使用比率=比率来传递新的集合。在哪里(a => a.ID == 0).ToList(); 所以集合现在还没有保存参考中的实体。
您可能需要手动清除集合并将所有新ratios
添加回集合中。 我很积极,你不能像上面所做的那样仅仅将集合设置为新的参考。 当你这样做时,NHibernate没有办法跟踪对集合的更改。
我没有测试下面的内容,但它应该更接近你所需要的:
cat.Ratios.Clear();
foreach(Ration ratio in ratios)
cat.Ratios.Add(ratio);
_repository.Save(cat)
和_repository.Update(cat)
在做什么呢? 如果他们调用ISession.Save
和ISession.Update
这是不必要的,因为您可能在一对多收集Ratios
上设置了级联。 您可以简单地提交事务,因为NHibernate通过ISession
跟踪对实体/集合的更改
上一篇: deleting and creating new child collection in Nhibernate in same session