我需要删除父项中的现有集合并插入新的集合条目。这应该发生在同一个交易中。 请检查以下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会话事务中。 我只使用ratios = ratios.Where(a =&gt; a.ID == 0).ToList(); 因此,该集合现在还没有在参考中保存实体。
答案 0 :(得分:1)
您可能需要手动清除集合并将所有新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