在NHibernate 3.1更新时崩溃

本文关键字:崩溃 更新 NHibernate | 更新日期: 2023-09-27 18:13:38

我正在写一个项目,使用NHibernate 3.1

SimpleTest:

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

实现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)
}

您不能混淆呼叫会话。SaveOrUpdate(实体)在分支else中,因为在外部事务中调用Update是必要的。

  • 首先,我用Version = 1接收admin。他的状态是持久的。
  • 我可以改变任何属性的值。
  • 当流到达tx.Commit();行时,NHibernate生成一个查询:

    更新用户SET Version = 2,Name = 'admin',EncryptedPassword = '21232f297a57a5a743894a0e4a801fc3',EMail = 'admin@admin.com',IsActivated = 1,isban = 0,CommentsNumber = 0;角色= 'Admin',FirstName = 'Alexey',LastName = 'Kovpaev',出生日期= '1992-01-02T12:00:00.00',About = 'Just admin',签名= '签名'WHERE UserId = 'e23056df-d934-4880-b6b8-f2128cd41504'AND Version = 1

  • 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();
    }

首先,版本号正确。第二,其他事务根本不存在。

为什么?

在NHibernate 3.1更新时崩溃

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

如何在NHibernate中做嵌套事务?

实现NHibernate嵌套事务行为