gpt4 book ai didi

nhibernate - 为什么从 Session 中逐出对象不会提交对数据库的更改?

转载 作者:行者123 更新时间:2023-12-03 23:58:13 25 4
gpt4 key购买 nike

我在我的应用程序中使用 NHibernate 并遇到以下情况。 (注意这里的情况为了便于理解,简化了很多)

从数据库中查询一个对象。它使用 Session.Update() 进行编辑和更新。然后在提交事务之前从 session 中逐出对象(使用 Session.Evict(obj))。预期结果是将更改持久保存到数据库中。

当我将 Id 列作为 NHibernate identity 列时,这曾经工作得很好。最近,我们将 Id 列更改为非标识。因此,除非我在 Evict 之前显式调用 Session.Flush(),否则上述情况不会保留到数据库中。

有人可以向我指出/解释这种行为的原因吗?

此链接,NHibernate Session.Flush & Evict vs Clear , 提到了一些关于 Evict 和标识列的内容,这对我来说不是很清楚。

最佳答案

您的工作流程不正确。

首先,当您从数据库中检索对象时,session.Update(entity) 不会执行任何操作。更改将在 Flush/Commit

上自动发生

接下来,Evict 删除 session 对对象的所有了解,因此它不会保留应用到它的任何更改。在正常情况下,您几乎不应该使用此方法,这让我认为您没有正确处理 session 。

第三,使用identity 导致insertsSave 上立即发生的事实是一个限制,而不是一个特性。

正确的工作流程是:

using (var session = factory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var entity = session.Get<EntityType>(id);
entity.SomeProperty = newValue;
transaction.Commit();
}

确切的结构(using 语句等)在桌面应用程序中可能会发生变化,但基本思想是相同的。

关于nhibernate - 为什么从 Session 中逐出对象不会提交对数据库的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305833/

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