将 ExecuteInTransaction 与 UserManager 结合使用
Using ExecuteInTransaction with UserManager
我们正在实施 EnableRetryOnFailure
,但正如在 https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency 上所讨论的那样,这对于用户定义的交易来说并不是开箱即用的。
上述 link(选项 3 和 4)的建议之一是使用 ExecutionStrategy.ExecuteInTransaction
,并使用 acceptAllChangesOnSuccess: false
调用 SaveChanges
。
这是必要的,以便在 SaveChanges 成功但事务失败时可以重试事务。
我们遇到的问题是我们有 UserManager
方法封装在我们的交易中,这些方法将在内部调用 SaveChanges
上下文。
当我们无法将 UserManager
更改为使用 acceptAllChangesOnSuccess: false
时,我们如何做到这一点?
使用 UserManager.CreateUser 方法添加用户将调用内部 UserStore 上的 SaveChanges 方法。
UserStoreclass有一个public属性,AutoSaveChanges,表示是否调用SaveChanges方法。
通过将 AutoSaveChanges 属性 设置为 false 然后调用 UserManager.CreateUser 方法,将不会调用 SaveChanges 方法。
- 将 false 设置为 UserStore.AutoSaveChanges 属性。
- userManager.CreateAsync(用户)(不调用 SaveChanges)
- context.SaveChanges(acceptAllChangesOnSuccess: false)
我们正在实施 EnableRetryOnFailure
,但正如在 https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency 上所讨论的那样,这对于用户定义的交易来说并不是开箱即用的。
上述 link(选项 3 和 4)的建议之一是使用 ExecutionStrategy.ExecuteInTransaction
,并使用 acceptAllChangesOnSuccess: false
调用 SaveChanges
。
这是必要的,以便在 SaveChanges 成功但事务失败时可以重试事务。
我们遇到的问题是我们有 UserManager
方法封装在我们的交易中,这些方法将在内部调用 SaveChanges
上下文。
当我们无法将 UserManager
更改为使用 acceptAllChangesOnSuccess: false
时,我们如何做到这一点?
使用 UserManager.CreateUser 方法添加用户将调用内部 UserStore 上的 SaveChanges 方法。 UserStoreclass有一个public属性,AutoSaveChanges,表示是否调用SaveChanges方法。 通过将 AutoSaveChanges 属性 设置为 false 然后调用 UserManager.CreateUser 方法,将不会调用 SaveChanges 方法。
- 将 false 设置为 UserStore.AutoSaveChanges 属性。
- userManager.CreateAsync(用户)(不调用 SaveChanges)
- context.SaveChanges(acceptAllChangesOnSuccess: false)