C# 工作单元模式序列

C# 工作单元模式序列,c#,oop,design-patterns,unit-of-work,C#,Oop,Design Patterns,Unit Of Work,我试图使用工作单元模式来使用事务,这样所有的数据库更改都可以一次提交 正如我在教程中所看到的,在调用Commit方法时,我在添加实体的列表中循环,然后更改,然后删除,并调用它们的存储库方法 但若在这种情况下,我有一个要求,我首先删除一个项目,然后添加一个新项目(若值是唯一的,我需要先删除,然后添加)。我知道我可以更新它,但只要说如果我想这样做,那么无论我先调用哪个方法,当我提交时,它都会先添加然后删除,所以如何进行适当的压缩?关于UnitOfWork的整个事情是,你不必为那些低级细节而烦恼。如果

我试图使用工作单元模式来使用事务,这样所有的数据库更改都可以一次提交

正如我在教程中所看到的,在调用Commit方法时,我在添加实体的列表中循环,然后更改,然后删除,并调用它们的存储库方法


但若在这种情况下,我有一个要求,我首先删除一个项目,然后添加一个新项目(若值是唯一的,我需要先删除,然后添加)。我知道我可以更新它,但只要说如果我想这样做,那么无论我先调用哪个方法,当我提交时,它都会先添加然后删除,所以如何进行适当的压缩?

关于UnitOfWork的整个事情是,你不必为那些低级细节而烦恼。如果你认为结果会有所不同,那么你应该按自己的方式去做,但不要指望一个团队以任何可预测的方式去做。当数据库技术发生前所未有的变化时,无法保证如何获得实际结果。你得到的只是一个保证,无论发生什么,结果都是一样的


因此,如果由于某种遗留约束,您确实无法抽象出机械视图,那么最好不要使用此高级工具来完成此工作。恢复到实际事务和显式序列。

工作单元中涉及的聚合具有唯一标识,以便在聚合的生命周期内跟踪聚合的更改。除非两个聚合具有相同的标识,否则即使它们的属性相同,它们也不是相同的聚合

工作单元模式中建立的命令禁止操纵不存在的聚合。如果改变顺序,行为就会破裂,因此无法改变

如果您的需求是删除聚合并使用相同的标识重新创建它,这将破坏聚合的唯一性

值得花一些时间研究业务需求。实际要求是重置骨料的状态吗?这与创建具有相同标识的新聚合相同,但如果需要,还可以维护聚合的整个历史记录


或者,您可以删除旧的聚合并创建新的聚合,但由于上述原因,它将不是相同的聚合。然后,可以重新分配引用旧聚合的依赖聚合,以引用其位置上的新聚合。

以下是NHibernate的操作方式。你会得到一个好的模特

SQL语句按以下顺序发出

所有实体插入,以相同的顺序插入相应的对象 已使用ISession.Save()保存

所有实体更新

所有集合删除

所有集合元素的删除、更新和插入

所有集合插入

所有实体删除,以相同的顺序删除相应的对象 使用ISession.Delete()删除