我正在编写项目并使用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();
}
首先,版本号是正确的。 其次,其他交易不存在。
为什么?
答案 0 :(得分:0)
我发现两个消息来源声称NHibernate不支持嵌套事务。建议的解决方案似乎是Ayendes UnitOfWork实现或将您的事务嵌套在TransactionScope中。