Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate ISession.SaveOrUpdateCopy()和ISession.Merge()之间有什么区别?_Nhibernate_Nhibernate 3 - Fatal编程技术网

Nhibernate ISession.SaveOrUpdateCopy()和ISession.Merge()之间有什么区别?

Nhibernate ISession.SaveOrUpdateCopy()和ISession.Merge()之间有什么区别?,nhibernate,nhibernate-3,Nhibernate,Nhibernate 3,在NHibernate 3.1中,ISession.SaveOrUpdateCopy()已被标记为不推荐使用。文档建议使用Merge()。各文件如下所示: SaveOrUpdateCopy(对象对象对象) 将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与关联的持久实例 该会话将被加载。返回持久实例。如果 给定实例未保存或数据库中不存在,请将其保存并重试 将其作为新的持久实例返回。否则,给定的实例 不会与会话关联 合并(对象对象对象) 将给定对象的状态复制到具有相同 标识符。如果当

在NHibernate 3.1中,
ISession.SaveOrUpdateCopy()
已被标记为不推荐使用。文档建议使用
Merge()
。各文件如下所示:

SaveOrUpdateCopy(对象对象对象)
将给定对象的状态复制到具有相同标识符的持久对象上。如果当前没有与关联的持久实例 该会话将被加载。返回持久实例。如果 给定实例未保存或数据库中不存在,请将其保存并重试 将其作为新的持久实例返回。否则,给定的实例 不会与会话关联

合并(对象对象对象)
将给定对象的状态复制到具有相同 标识符。如果当前没有与关联的持久实例 该会话将被加载。返回持久实例。如果 如果给定实例未保存,请保存其副本,并将其作为新的持久性副本返回 例如。给定实例不会与会话关联。 如果关联已映射,则此操作将级联到关联实例 使用
cascade=“merge”

该方法的语义由JSR-220定义


他们看起来和我几乎一模一样,但肯定有一些微妙之处。如果是,它们是什么?

保存或更新副本现在被认为是过时的,因此合并意味着取代它(因此它的极端相似性)

它们几乎相同,只是我认为那些级联选项在SaveOrUpdateCopy中不可用。然而,这一点毫无意义,因为合并应该是您使用的方法


更新:我查阅了NHibernate的源代码,以确保它们与我所想的一样,以下是我的发现

MergeSaveOrUpdateCopy都有非常相似的实现:

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;
    }
}
这意味着合并保存或更新副本的默认行为仅在级联操作中不同,其他所有操作都完全相同

public class DefaultSaveOrUpdateCopyEventListener : DefaultMergeEventListener
{
    protected override CascadingAction CascadeAction
    {
        get { return CascadingAction.SaveUpdateCopy; }
    }
}