在NHibernate 3.1中,ISession.SaveOrUpdateCopy()
已被标记为已弃用。该文档建议改为使用Merge()
。每个文件的文档如下:SaveOrUpdateCopy(object obj)
Merge(object obj)
它们看起来与我几乎完全相同,但是必然涉及一些微妙之处。如果是这样,它们是什么?
最佳答案
SaveOrUpdateCopy 现在被认为已过时,因此合并可以取代它(因此具有极大的相似性)。
它们几乎相同,除了 SaveOrUpdateCopy 不提供那些级联选项。但是,这很不现实,因为合并应该是您使用的方法。
更新:我进入NHibernate的源代码只是为了确保它们与我想的一样,这就是我所发现的。
合并和 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 )也相同!
查看监听器列表,它们都使用默认监听器初始化。 合并监听处理程序的默认监听器类型为 DefaultMergeEventListener ,而 SaveOrUpdateCopy 是 DefaultSaveOrUpdateCopyEventListener 。因此,它们之间的区别只是这两种实现方式的区别(也就是说,如果保留默认的监听器,则是99%的时间)。
但是,真正有趣的事实是在实现上的差异。如果查看 DefaultSaveOrUpdateCopyEventListener ,则会得到以下信息:
public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
protected override CascadingAction CascadeAction
{
get { return CascadingAction.SaveUpdateCopy; }
}
}
这意味着合并和 SaveOrUpdateCopy 的默认行为仅在级联操作上有所不同,其他所有内容都完全相同。
关于nhibernate - ISession.SaveOrUpdate Copy()和Session.Merge()有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6943566/