保存或更新副本现在被认为已过时,因此Merge旨在接管它(因此它极其相似)。
它们几乎是相同的,只是我不认为这些级联选项可用保存或更新副本。然而,这一点没有实际意义,因为Merge应该是你使用的方法。
UPDATE:我查看了 NHibernate 的源代码只是为了确保它们与我想象的一样相似,这就是我发现的。
Both Merge and 保存或更新副本有非常相似的实现:
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));
}
}
Their 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监听处理程序的类型默认合并事件监听器而保存或更新副本 is 默认保存或更新复制事件监听器。因此,它们之间的区别只是这两种实现的区别(也就是说,如果您保留默认侦听器,这是 99% 的时间)。
然而,真正有趣的事实IS实施上的差异。如果你看默认保存或更新复制事件监听器你得到这个:
public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
protected override CascadingAction CascadeAction
{
get { return CascadingAction.SaveUpdateCopy; }
}
}
这意味着默认行为Merge and 保存或更新副本只是级联动作有所不同,其他一切都完全相同。