在NHibernate 3.1中更新时崩溃

时间:2011-11-05 01:05:55

标签: c# .net hibernate nhibernate concurrency

我正在编写项目并使用NHibernate 3.1

SimpleTest的:

        IUserRepository userRepository = new UserRepository(SessionFactory);
        var admin = userRepository.GetByName("admin");
        admin.Profile.Signature = "Signature";
        userRepository.Update(admin);

Implementation Repository.Update():

public virtual void Update(TEntity entity)
{
    if (!session.Transaction.IsActive)
    {
        TResult result;
        using (var tx = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity)
            tx.Commit();
        }
        return result;
    }
    session.SaveOrUpdate(entity)
}

您不能在分支else中混淆调用session.SaveOrUpdate(entity),因为如果在外部事务中调用Update,则必须这样做。

  • 首先,我收到了Version = 1的管理员。他的国家坚持不懈。
  • 我更改了任何属性的值。
  • 我做了更新。
  • 当流程到达tx.Commit();行时,NHibernate会生成一个查询:

    更新用户 SET版本= 2,        名称='admin',        EncryptedPassword ='21232f297a57a5a743894a0e4a801fc3',        EMail ='admin@admin.com',        IsActivated = 1,        IsBanned = 0,        CommentsNumber = 0,        Role ='Admin',        FirstName ='Alexey',        LastName ='Kovpaev',        DateOfBirth ='1992-01-02T12:00:00.00',        关于='只是管理员',        签名='签名' 用户IDI ='e23056df-d934-4880-b6b8-f2128cd41504'        AND Version = 1

  • NHibernate抛出异常:NHibernate.StaleObjectStateException:Row被另一个事务更新或删除(或未保存的值映射不正确)

它也不起作用并导致相同的例外:

    using (var tx = Session.BeginTransaction())
    {
        var admin = Session.CreateCriteria<User>().Add(Restrictions.Eq("Name", "admin")).UniqueResult<User>();
        admin.Profile.Signature = "Signature";
        Session.SaveOrUpdate(admin);
        tx.Commit();
    }

首先,版本号是正确的。 其次,其他交易不存在。

为什么?

1 个答案:

答案 0 :(得分:0)

我发现两个消息来源声称NHibernate不支持嵌套事务。建议的解决方案似乎是Ayendes UnitOfWork实现或将您的事务嵌套在TransactionScope中。

How do I do nested transactions in NHibernate?

Achieving NHibernate Nested Transactions Behavior