EMF合并两个对象

时间:2015-03-05 19:48:50

标签: object merge eclipse-emf emf eclipse-emf-ecore

我有EMF生成的模型。

我正在为它编写API,以便为用户提供更简单的CRUD操作。

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

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

如果用户拨打save,我无法直接将工作副本复制到original,因为它不会更改model(副本{{1}将为null,原始模型将完整无缺。)

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

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

2 个答案:

答案 0 :(得分:1)

创建复制模型不是一个好主意。可能您可以为用户完成的每个修改创建Compoundcommand和一系列命令,并保持附加到堆栈以进行任何操作。如果用户单击“保存”,则执行命令如果单击discard,则不执行。

答案 1 :(得分:1)

我假设这些数据无法同时被多个用户/线程编辑甚至访问。 如果是这样,那么实现此类行为的最简单方法是使用 Change Recorder ,这是EMF框架的一部分。

当用户开始编辑数据时,您只需将Change Recorder附加到树中最想要跟踪的对象(可能是整个模型),然后开始录制。实际上,这些更改将在原始对象中完成,但万一用户调用"放弃更改"然后使用Change Recorder收集的更改执行回滚(撤消)。如果用户打电话"保存"那么你不需要做任何其他事情,因为原来的对象已经改变了,只需处理变更记录器。

实际上已经有 EMF Transactions 框架提供了一个事务命令堆栈,它使用内部的Change Recorder来提供撤消和重做功能。在您的情况下,您只需要使用"撤消"当用户打电话"放弃改变"。