在同一会话中删除并在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.SaveISession.Update这是不必要的,因为您可能在一对多收集Ratios上设置了级联。 您可以简单地提交事务,因为NHibernate通过ISession跟踪对实体/集合的更改

链接地址: http://www.djcxy.com/p/23243.html

上一篇: deleting and creating new child collection in Nhibernate in same session

下一篇: NHibernate Cascade Behavior for Same Session Updates