Object 合并两个对象的EMF

Object 合并两个对象的EMF,object,merge,eclipse-emf,emf,eclipse-emf-ecore,Object,Merge,Eclipse Emf,Emf,Eclipse Emf Ecore,我有一个由EMF生成的模型 我在上面编写API,为用户提供更简单的CRUD操作 为此,在API类的构造函数中,我使用EcoreUtil.copy创建ECore对象的工作副本。然后,所有操作都会在此工作副本上进行 如果用户调用放弃更改。我再次创建原始对象的副本,并重新初始化工作副本对象 如果用户调用保存,我无法将工作副本直接复制到原始,因为它不会更改模型(副本的电子容器将为空,原始模型将保持完整) 因此,我想将我的工作副本合并为原始副本。一种可能的解决方案是逐个设置原始数据的所有字段。但是,在有大

我有一个由EMF生成的模型

我在上面编写API,为用户提供更简单的CRUD操作

为此,在API类的构造函数中,我使用
EcoreUtil.copy
创建ECore对象的工作副本。然后,所有操作都会在此工作副本上进行

如果用户调用放弃更改。我再次创建原始对象的副本,并重新初始化工作副本对象

如果用户调用
保存
,我无法将工作副本直接复制到
原始
,因为它不会更改
模型
(副本的
电子容器
将为空,原始模型将保持完整)

因此,我想将我的工作副本合并为原始副本。一种可能的解决方案是逐个设置原始数据的所有字段。但是,在有大量字段的情况下,它可能会很长并且容易出错


如何轻松执行合并操作?还有什么其他可能的方法来解决这个问题

创建副本模型不是一个好主意。可能您可以为用户所做的每一次修改创建Compoundcommand和一系列命令,并为任何操作不断追加到堆栈中。如果用户单击“保存”,则执行命令。如果单击“放弃”,则不执行

我假设这些数据不能被多个用户/线程同时编辑或访问。 如果是这样的话,那么实现这种行为的最简单方法就是使用变更记录器,它是EMF框架的一部分

当用户开始编辑数据时,您只需将更改记录器附加到树中最外部的要跟踪的对象(可能是整个模型),然后开始记录。这些更改实际上将在原始对象中完成,但如果用户调用“放弃更改”,那么您将使用更改记录器收集的更改执行回滚(撤消)。如果用户调用“save”,那么您不需要执行任何其他操作,因为原始对象已经更改,只需处理更改记录器即可


实际上已经有了EMF Transactions框架,它提供了一个事务命令栈,它使用内部变更记录器来提供撤销和重做功能。在您的情况下,当用户调用“放弃更改”时,您只需使用“撤消”即可。

如果在编辑过程中执行的每个更改都需要应用以前的更改,则这可能会有很大的限制-例如在UI中编辑2个属性,如果第二个属性的可能值列表取决于用户将为第一个属性选择的值,则使用复合命令需要有额外的逻辑来编排多个命令,或者假设每个命令的结果是什么,向UI提供正确的数据。我认为在单击“放弃”时进行更改跟踪并执行回滚更容易维护,