NHibernate-级联合并子实体对于分离的父实体失败

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (52)

现行方法

在ASP.NETWeb窗体应用程序(使用Spring.NET和NHibernate)中,我们有一个聚合根(),其详细信息将在多个屏幕/页面上捕获。实体在进入此工作流之前存在,并且对对象图是原子的,因此只有在提交最终屏幕时才应该将其刷新到数据库。

第一次使用NHibernate 3.2从数据库进入第一页,然后加载并保存序列化的对象图到HTTP会话变量,当我们在整个过程中页面时。

检索完在HTTP会话之外,它处于与当前NHibernate会话分离的状态,因此我们通过调用更新()方法,如下所示:

var sessionPerson = Session[PersonSessionName] as Person;
var currentSession = SessionFactory.GetCurrentSession();
currentSession.Update(sessionPerson);

注:使用锁()抛出一个异常,建议“重新组合的对象有脏集合”。

当重新附加时,我们可以像预期的那样遍历对象图,从数据库中提取尚未加载到内存中的子实体的数据。

映射文件子集

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false" assembly="Domain" namespace=" TestApp.Domain">
  <class name="Person" table="Person">
    <id name="Id">
      <generator class="TestApp.CustomNHibernateHiLoGenerator, TestApp.Core" />
    </id>
    <property name="Name" not-null="false" />

    <bag name="PersonCountries" access="field.camelcase-underscore" cascade="all-delete-orphan">
      <key column="PersonId" foreign-key="FK_ PersonCountry_Person" not-null="true" />
      <one-to-many class="PersonCountry" />
    </bag>
  </class>

  <class name="Country" table="Country">
    <id name="Id">
      <generator class="TestApp.CustomNHibernateHiLoGenerator, TestApp.Core" />
    </id>
    ... No back reference to Person
  </class>
</hibernate-mapping>

public class PersonCountry : Entity, ICloneable
{
    // No properties of note
}

public class Person : Entity, ICloneable
{
    public virtual string Name { get; set; }
    public virtual IEnumerable<PersonCountry> PersonCountries { get; set; }
    ... 
    // More Properties
}

对数据库的刷新更改

.. // Code-behind
PricingService.Save(ProductContext.Pricing, forceMerge: true);            


public class PricingService : IPricingService
{
   [Transaction]  // Spring.NET transaction
   public Pricing Save(Pricing pricing, bool forceMerge = false)
   {            
      if(forceMerge)
      {
         CurrentSession.Merge(entity);
      }
      else
      {
         CurrentSession.SaveOrUpdate(entity);
      }
   }
}

当需要刷新数据库的所有更改时,只要我们只更改名称但是,添加一个新的国家项至导致合并()在一对多的关系中失败,但有以下异常(奇怪的是,删除国家工作得很好)。

NHibernate.StaleStateException: Batch update returned unexpected row count from update; actual row count: 0; Expected: 1

任何帮助都将不胜感激。

提问于
用户回答回答于

每个具有有效ID的实体都被视为持久化的,这就是为什么它试图在合并中更新它,但是因为它还没有被保存,所以失败了。打电话session.Flush()session.Update()

扫码关注云+社区

领取腾讯云代金券