我注意到,通过使用log4net,当调用ISession.Update时,它会更新所有更改的对象。
例如:
// 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一个接一个地更新吗?
发布于 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命令。
发布于 2011-07-24 19:59:41
当session的FlushMode为Auto或Commit时,这是默认行为。
在这些情况下,调用transaction.Commit()会刷新会话并更新所有持久对象
因此,如果删除调用Session.Update,也不会有任何不同
可以让NHibernate逐个更新吗?
是。如果可能,使用FlushMode.Never或推迟提交会话。我想在这种情况下你不需要使用驱逐
https://stackoverflow.com/questions/3743202
复制相似问题