首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate ISession.Update

NHibernate ISession.Update
EN

Stack Overflow用户
提问于 2010-09-19 03:40:24
回答 2查看 6K关注 0票数 3

我注意到,通过使用log4net,当调用ISession.Update时,它会更新所有更改的对象。

例如:

代码语言:javascript
复制
// Change 2 instances 
user1.IsDeleted = true;
user2.UserName = "Xyz";
// Call session.Update to update the 2 users
using (ITransaction transaction = session.BeginTransaction())
{
    Session.Update(user1); // This updates both user1 & user2
    transaction.Commit();
}
using (ITransaction transaction = session.BeginTransaction())
{
    Session.Update(user2); // Now there is no need for this
    transaction.Commit();
}

这是NHibernate的默认行为还是与我的映射文件有关?

我可以让NHibernate一个接一个地更新吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-19 04:21:32

这是和

Hibernate维护已插入、更新或删除的对象的缓存。它还维护已从数据库查询的对象的缓存。只要用于获取这些对象的EntityManager仍然处于活动状态,这些对象就被称为持久对象。这意味着在提交事务时,在事务范围内对这些对象所做的任何更改都会自动持久化。这些更新在事务的边界内是隐式的,您不必显式调用任何方法来持久化值。

来自

Q)我还需要保存和更新内部交易吗?

只有非持久性对象(如新对象)才需要Save()。您可以使用更新将已逐出的对象带回会话中。

来自

我刚刚发现,如果我从NHibernate会话中获取一个对象并更改object的属性,NHibernate将在提交时自动更新该对象,而无需我调用Session.Update(myObj)!

回答:您可以将Session.FlushMode设置为FlushMode.Never。这将使您的操作显式,即:在tx.Commit()或session.Flush()上。当然,这仍然会在提交/刷新时更新数据库。如果您不想要此行为,请调用session.Evict(yourObj),然后它将变成瞬态的,并且NHibernate将不会为其发出任何db命令。

票数 13
EN

Stack Overflow用户

发布于 2011-07-24 19:59:41

当session的FlushMode为Auto或Commit时,这是默认行为。

在这些情况下,调用transaction.Commit()会刷新会话并更新所有持久对象

因此,如果删除调用Session.Update,也不会有任何不同

可以让NHibernate逐个更新吗?

是。如果可能,使用FlushMode.Never或推迟提交会话。我想在这种情况下你不需要使用驱逐

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3743202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档