SaveOrUpdateCopy现在已被认为是过时的,因此Merge被视为其继任者(因此它们非常相似)。
它们几乎完全相同,除了我不认为SaveOrUpdateCopy具有级联选项。然而,这一点已经无关紧要了,因为应该使用Merge方法。
更新:我进入NHibernate的源代码,确保它们是我所想象的那样相似,以下是我的发现。
Merge和SaveOrUpdateCopy都有非常相似的实现:
public object Merge(string entityName, object obj)
{
using (new SessionIdLoggingContext(SessionId))
{
return FireMerge(new MergeEvent(entityName, obj, this));
}
}
public object SaveOrUpdateCopy(object obj)
{
using (new SessionIdLoggingContext(SessionId))
{
return FireSaveOrUpdateCopy(new MergeEvent(null, obj, this));
}
}
他们的FireXXXX方法也非常相似:
private object FireMerge(MergeEvent @event)
{
using (new SessionIdLoggingContext(SessionId))
{
CheckAndUpdateSessionStatus();
IMergeEventListener[] mergeEventListener = listeners.MergeEventListeners;
for (int i = 0; i < mergeEventListener.Length; i++)
{
mergeEventListener[i].OnMerge(@event);
}
return @event.Result;
}
}
private object FireSaveOrUpdateCopy(MergeEvent @event)
{
using (new SessionIdLoggingContext(SessionId))
{
CheckAndUpdateSessionStatus();
IMergeEventListener[] saveOrUpdateCopyEventListener = listeners.SaveOrUpdateCopyEventListeners;
for (int i = 0; i < saveOrUpdateCopyEventListener.Length; i++)
{
saveOrUpdateCopyEventListener[i].OnMerge(@event);
}
return @event.Result;
}
}
这两种方法完全相同,只是它们绘制在不同的事件监听器列表上,但即使列表的类型(IMergeEventListener)也是相同的!
查看监听器列表,它们都使用默认监听器进行初始化。 Merge 监听处理程序的默认监听器类型为 DefaultMergeEventListener,而 SaveOrUpdateCopy 则为 DefaultSaveOrUpdateCopyEventListener。因此,它们之间的差异只是这两个实现之间的差异(假设您保留默认监听器,这通常占99%的时间)。
然而,真正有趣的事实是其实是实现的不同。如果您查看 DefaultSaveOrUpdateCopyEventListener,您会得到以下内容:
public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
protected override CascadingAction CascadeAction
{
get { return CascadingAction.SaveUpdateCopy; }
}
}
这意味着Merge和SaveOrUpdateCopy的默认行为只在级联动作方面有所不同,其他一切都完全相同。