Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 对于将自动生成新对象(自动增量id)的事务来说,工作单元是一种良好的模式吗?_Design Patterns_Architecture_Transactions_Domain Driven Design_Unit Of Work - Fatal编程技术网

Design patterns 对于将自动生成新对象(自动增量id)的事务来说,工作单元是一种良好的模式吗?

Design patterns 对于将自动生成新对象(自动增量id)的事务来说,工作单元是一种良好的模式吗?,design-patterns,architecture,transactions,domain-driven-design,unit-of-work,Design Patterns,Architecture,Transactions,Domain Driven Design,Unit Of Work,从工作单元模式来看,我理解了一种基于某些域报告(使用每个域对象的存储库)执行典型事务的方法。示例:在UoW对象中定义一些存储库对象后,根据您的状态提交这些存储库 此外,存储库不应包含任何事务逻辑 当insert()导致创建一个新对象(自动生成的id)时会发生什么情况,该对象稍后会被同一事务中的另一个对象所需要 在这种情况下,工作单元似乎不起作用。在运行UoW提交时生成对象的情况下,可能会有更具体、更复杂的事务 在这种情况下应该如何处理事务?通常,NHibernate或EntityFramewor

从工作单元模式来看,我理解了一种基于某些域报告(使用每个域对象的存储库)执行典型事务的方法。示例:在UoW对象中定义一些存储库对象后,根据您的状态提交这些存储库

此外,存储库不应包含任何事务逻辑

当insert()导致创建一个新对象(自动生成的id)时会发生什么情况,该对象稍后会被同一事务中的另一个对象所需要

在这种情况下,工作单元似乎不起作用。在运行UoW提交时生成对象的情况下,可能会有更具体、更复杂的事务


在这种情况下应该如何处理事务?

通常,NHibernate或EntityFramework之类的ORM知道如何处理对DB的调用顺序。例如,用于指定谁负责双向关系

如果您开发自己的DataAccessLayer/ORM,则您有责任指定调用顺序最简单的解决方案是“添加所有新实体”=>“删除所有已删除的实体”=>“更新所有脏实体”。


将实体添加到数据库后,您可以检索其结果,然后使用任何适当的解决方案更新其
Id

保存前手动检索此Id如何?您使用的自动生成策略是什么?我说的是自动增量属性(rdbms序列)。就像Oracle序列一样?请阅读此处:如何向db添加具有外键约束的行?您的解决方案似乎临时引用了一个不存在的ID。此解决方案听起来不太好。无论如何,您的解决方案不适合复杂的嵌套自动生成对象。应该对脏/新对象执行多少次持久化调用?对于复杂的事务来说,这似乎是不可能的,也不是一个好的解决方案。@Geo C.我根本不支持“临时引用不存在的ID”。如果行具有外键约束,则应在之前添加这些约束(例如,正确使用NHibernates逆解来解决它)。所以,首先要添加所有引用的实体,然后向这些实体添加具有外键的行。若知道对DB的调用顺序,那个么就有可能形成代码规则。@GeoC。“应该对脏/新对象执行多少次持久化调用?”我对每个新对象执行一次调用,对每个删除对象执行一次调用,对每个脏实体执行一次调用。但是你有很多选择。首先-每个
插入
更新
删除
都是应用程序对DB的单独调用(在我的例子中,我使用存储过程来实现复杂的解决方案)。第二,您可以以某种方式组合生成的SQL以减少对DB的调用数量。第三,您可以简单地使用任何ORM并对其进行配置。