gpt4 book ai didi

nhibernate - 当行版本不匹配时,为什么 nHibernate 不会在 SaveOrUpdate 上抛出陈旧状态异常?

转载 作者:行者123 更新时间:2023-12-03 12:00:47 26 4
gpt4 key购买 nike

这会导致 StaleStateException 异常:

var entity = Session.Load(id);
Session.Evict(entity);
entity.SomePropert = "Something";
entity.Version = Version--;
Session.SaveOrUpdate(entity); // Throws Exception

但是,这不会引发异常。也没有行更新。
var entity = Session.Load(id);
entity.SomePropert = "Something";
entity.Version = Version--;
Session.SaveOrUpdate(entity); // Does not throw Exception,
// but no rows are updated

最佳答案

简短的回答是因为 version 是一个由 NHibernate 管理的属性。您可以更改它,但您的更改将被忽略。正如您所发现的,使更改保持不变的一种方法是驱逐对象,然后重新附加/保存/更新。驱逐导致 NHibernate 忘记它的版本值是什么,这使得它从对象中获取它。 (我在这里可能过于简单化了。)

这个问题之前已经提出过。很多人问为什么有人想要这样做——一个有效的场景是无状态的 Web 应用程序。每个 HTTP 请求都会创建自己的 NHibernate session ,该 session 在请求完成时终止。可能会请求显示对象的部分详细信息以进行编辑的页面。 ID 和版本保存在隐藏字段中。在 postpack 上(这是一个新的请求,这次只有数据),一个新的 NHibernate session 重新加载有问题的对象,应用表单数据的更改,包括版本,然后保存对象。在这种情况下在这里修改版本是完全有效的。如果其他人在初始请求和回发之间修改了同一对象,则不应覆盖这些更改。应该抛出陈旧的对象异常,但不会抛出,因为 NHibernate 忽略了版本更改。

我知道有两种方法可以修复这些场景的版本“错误”。一种是OP已经说明的驱逐方法。二是创建一个NHibernate拦截器来捕获更新操作并手动检查版本。

这个问题和两种解决方案都讲到这里。

https://forum.hibernate.org/viewtopic.php?t=977889

我使用从此处提供的代码修改的拦截器。

http://weblogs.asp.net/stefansedich/archive/2008/10/01/set-the-value-of-a-version-column-in-nhibernate-manually.aspx

我的拦截器看起来略有不同(我使用 NHibernate 2.1.2.4000)。

private void CheckVersion(object domainObject, object uid)
{
ISessionImplementor sessionImpl = Session.GetSessionImplementation();
IEntityPersister persister = sessionImpl.GetEntityPersister(null, domainObject);

if (persister.IsVersioned)
{
EntityMode mode = Session.GetSessionImplementation().EntityMode;
object version = persister.GetVersion(domainObject, mode);
object currentVersion = persister.GetCurrentVersion(uid, sessionImpl);

if (!persister.VersionType.IsEqual(version, currentVersion))
throw new StaleObjectStateException(persister.EntityName, uid);
}
}

关于nhibernate - 当行版本不匹配时,为什么 nHibernate 不会在 SaveOrUpdate 上抛出陈旧状态异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com