在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不支持嵌套事务。建议的解决方案似乎是Ayendes UnitOfWork实现或将您的事务嵌套在TransactionScope中。
如何在NHibernate中做嵌套事务?
实现NHibernate嵌套事务行为