在同一会话中删除和创建Nhibernate中的新子集合

时间:2012-03-27 10:44:44

标签: 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会话事务中。 我只使用ratios = ratios.Where(a =&gt; a.ID == 0).ToList();  因此,该集合现在还没有在参考中保存实体。

1 个答案:

答案 0 :(得分:1)

您可能需要手动清除集合并将所有新ratios添加回集合中。我很肯定你不能像上面那样将集合设置为新的引用。当你这样做时,NHibernate无法跟踪集合的变化。

我没有对下面的内容进行过测试,但它应该更贴近您的需求:

cat.Ratios.Clear();
foreach(Ration ratio in ratios)
    cat.Ratios.Add(ratio);

_repository.Save(cat)_repository.Update(cat)究竟在做什么?如果他们正在调用ISession.SaveISession.Update,则这是不必要的,因为您可能在一对多集合Ratios上设置了级联设置。您可以简单地提交您的交易,因为NHibernate通过ISession

跟踪对实体/集合的更改