我试图使用工作单元模式来使用事务,以便一次性提交所有数据库更改。
正如我在教程中看到的,在调用Commit方法时,我遍历列表以添加实体,然后更改然后删除并调用其存储库方法。
但是,如果以防万一,我有一个要求,我首先删除一个项目,然后添加一个新项目(如果值是唯一的,我需要先删除,然后添加)。我知道我可以更新它,但只是说如果我想这样,那么无论我先调用哪种方法,当我提交时,它会先添加然后删除,那么如何制作一个合适的序列?
答案 0 :(得分:1)
工作单元中涉及的聚合具有唯一标识,以便跟踪聚合生命周期内聚合的更改。除非两个聚合具有相同的标识,否则即使它们的属性相同,它们也不是相同的聚合。
工作单元模式中建立的顺序禁止操纵不存在的聚合。如果要更改订单,行为将会中断,因此无法更改。
如果您的要求是删除聚合并使用相同的标识重新创建它,这将破坏聚合的唯一性。
值得花一些时间研究业务需求。实际要求是否可以重置聚合的状态?这与创建具有相同标识的新聚合相同,但如果需要,还可以保留聚合的整个历史记录。
或者,您可以删除旧聚合并创建一个新聚合,但由于上面给出的原因,它不会是相同的聚合。然后可以重新分配引用旧聚合的从属聚合以引用新聚合。
答案 1 :(得分:0)
关于UnitOfWork的全部事情是你不需要打扰那些低级细节。如果您认为结果会有所不同,那么您应该按照自己的方式强制执行,但不要指望UnitOfWork以任何可预测的方式执行此操作。当数据库技术变为前所未有的时候,无法保证如何获得实际结果。你得到的只是 保证结果无论如何都是相同的。
因此,如果您因为某种遗留约束而无法抽象出该机制视图,那么最好不要使用这种高级工具来完成这项工作。恢复实际交易和显式序列。
答案 2 :(得分:0)
这是NHibernate如何做到的。作为一个很好的模型,你会得到。
SQL语句按以下顺序发布
所有实体插入,按相同顺序对应的对象 使用ISession.Save()
保存所有实体更新
所有集合删除
所有集合元素删除,更新和插入
所有集合插入
所有实体删除,按相同对象的顺序排列 使用ISession.Delete()
删除