【发布时间】:2019-02-07 11:56:01
【问题描述】:
假设您有一个 UsersService、一个 TenantsService 和一个 TenantUserRolesService。
这些服务中的每一个都有一个“create”方法来创建它们的实体,并且注入了相同的 DbContext 依赖项,但注入了 Identity UserManager 类的 UsersService 除外。
您的目标是提供一个 API 端点,允许新租户注册,从而创建用户、租户和 TenantUserRole 实体。 TenantUserRole 是最后创建的,它是一个关联实体,具有新创建的用户、新创建的租户和“所有者”角色的外键。
在这 3 个服务之间创建原子事务的最佳方法是什么,这样如果单个创建失败,所有内容都会回滚,并且数据库不会处于损坏状态,即存在没有用户的租户或没有用户的用户等。
我看过:https://docs.microsoft.com/en-us/ef/core/saving/transactions,但我不知道是否有办法在不同的服务类之间使用这些方法。
我能想到的唯一方法就是采取命令式的方式,手动检查每次创建的结果,如果有错误则使用同一个实体服务删除最近创建的实体。
我希望有一个对该主题更了解的人可以为我指明正确的方向。
谢谢
【问题讨论】:
-
如果所有服务都使用相同的底层数据库上下文,您只需在其上打开一个事务,运行所有三个服务,然后完成该事务。这是因为数据库上下文是请求范围的,所以所有服务都可以使用同一个实例。
-
@poke 谢谢!数据库上下文是请求范围的,这对我来说并没有点击。
标签: c# .net entity-framework asp.net-core entity-framework-core