为什么NHibernate会抛出' ' staleobjectstateexception ' ' ?
本文关键字:staleobjectstateexception NHibernate 为什么 | 更新日期: 2023-09-27 18:12:56
我正在写一个项目,使用NHibernate 3.1
SimpleTest:
Forum forum = Session.CreateCriteria<Forum>().Add(Restrictions.Eq("UrlName", "reportabug")).UniqueResult<Forum>();
forum.TopicsCount++;
IForumRepository forumRepository = new ForumRepository(SessionFactory);
forumRepository.Update(forum);
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)
}
最后一次更新抛出异常:
StaleObjectStateException was unhandled by user code:
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
SQL查询:UPDATE Forums
SET Name = 'Forums Issues (not product support)' /* @p0 */,
UrlName = 'reportabug' /* @p1 */,
Description = 'Use this forum to report issues with the online forums application. When reporting an issue please include relevant details such as repro steps, error messages and browser version.' /* @p2 */,
CategoryId = 'b2cc232c-0d5c-4f35-bb6f-29c67d7d40c2' /* @p3 */,
TopicsCount = 1 /* @p4 */
WHERE ForumId = '864046b7-ca57-48c4-8a81-082103223527' /* @p5 */
ForumId正确。也许这就是并发性?有什么想法吗?
StaleObjectStateException
是一种休眠方式,确保数据一致性。Hibernate维护它更新的对象的version
,如果数据库中的版本和内存中的版本不匹配,将抛出错误。阅读更多关于乐观锁机制的信息。
因此,使用此信息调试应用程序。我不熟悉C#
语法,但我认为第二次保存应该是在else
条件下。