保存更新Vs更新并保存在NHibernate中

保存更新Vs更新并保存在NHibernate中,nhibernate,Nhibernate,NHibernate中的SaveOrUpdate和Save/Update有什么区别。你为什么不一直使用SaveOrUpdate呢?另外,SaveOrUpdateCopy的意义是什么?第9章比我能做的更好地介绍了所有这些: 但克里夫指出: Save()获取一个没有标识符的新对象并将其附加到会话。对象将是INSERT'd Update()获取具有标识符但不在会话中的现有对象,并将其附加到会话。对象将是UPDATE'd SaveOrUpdate()查看标识符,并决定在上述内容中需要什么 SaveOr

NHibernate中的SaveOrUpdate和Save/Update有什么区别。你为什么不一直使用SaveOrUpdate呢?另外,SaveOrUpdateCopy的意义是什么?

第9章比我能做的更好地介绍了所有这些:

但克里夫指出:

Save()
获取一个没有标识符的新对象并将其附加到会话。对象将是
INSERT
'd

Update()
获取具有标识符但不在会话中的现有对象,并将其附加到会话。对象将是
UPDATE
'd

SaveOrUpdate()
查看标识符,并决定在上述内容中需要什么

SaveOrUpdateCopy()
的特殊之处在于,您有两个具有相同标识符的对象——一个在会话中,另一个不在会话中。如果您尝试更新不在会话中的对象,则会正常引发异常(您现在尝试将两个表示相同持久对象的对象附加到会话)
SaveOrUpdateCopy()
将非会话对象状态复制到会话对象状态


我不确定您将如何使用NH,但在很多情况下,您只需要
Save()
。会话正在做所有必要的工作,以了解需要更新的内容,只需
Flush()
Commit()
即可完成所需的一切。

通常不需要SaveOrUpdate(),因为NHibernate跟踪每个加载对象的更改。要更新对象,请使用Session.Get(),进行更改,然后调用Session.Flush()。那么,在代码中什么更具可读性或更具意图:
SaveOrUpdate()
Flush()
/
Commit()
?或者它没有区别(语义或其他方面)?显式刷新会话可能没有必要。如果您提交一个事务或会话超出范围/被处理,更改将自动持久化(如果出于某种原因、id生成等需要,更改将在更早的时候持久化)。当你需要自动强制更改时,Flush(对我来说)是一种意图揭示,因为读丢失或其他一些深奥的东西,否则只是噪音。熟悉NH的任何人都会理解附加实体的隐式
Update
,因此我倾向于对显式
SaveOrUpdate
语句也有同样的想法。请参见此问题,尝试编辑,但编辑被拒绝。无论如何,
Save
上的行为在回答中是不正确的<代码>保存将根据需要
插入
更新
<但是,如果试图保存尚不存在的实体,则代码>更新将引发异常。