我有EMF生成的模型。
我在上面编写API,为用户提供更简单的CRUD操作。
为此,在API类的构造函数中,我使用EcoreUtil.copy
创建了ECore对象的工作副本。然后所有操作都发生在该工作副本上。
如果用户调用放弃更改。我再次创建原始对象的副本,并重新初始化工作副本对象。
如果用户调用save
,我不能直接将工作副本复制到original
,因为它不会更改model
(副本的eContainer
将为空,原始模型将保持不变)。
因此,我想将我的工作副本合并到原始。其中一个可能的解决方案是逐个设置原始的所有字段。但是,在大量字段的情况下,它可能很长并且容易出错。
我可以做些什么来轻松执行合并操作?解决这个问题的其他可能方法是什么?
我假设这些数据不能被多个用户/线程同时编辑甚至访问。如果是这样,那么实现这种行为的最简单方法就是使用ChangeRecorder,它是EMF框架的一部分。
当用户开始编辑数据时,只需将"更改录制器"附加到树中最外部的对象(可能是整个模型),然后开始录制。更改实际上将在原始对象中完成,但如果用户调用"放弃更改",则使用更改记录器收集的更改执行回滚(撤消)。如果用户调用"保存",那么您不需要做任何其他操作,因为原始对象已经更改,只需处理更改记录器即可。
实际上,已经有EMF Transactions框架提供了事务命令堆栈,该堆栈使用内部的更改记录器来提供撤消和重做功能。在您的情况下,您只需要在用户调用"放弃更改"时使用"撤消"。