在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/

10-10 21:31