将 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 方法。

https://github.com/dotnet/aspnetcore/blob/839cf8925278018903f53f22d580d15b0a59ca0f/src/Identity/EntityFrameworkCore/src/UserStore.cs#L141

  1. 将 false 设置为 UserStore.AutoSaveChanges 属性。
  2. userManager.CreateAsync(用户)(不调用 SaveChanges)
  3. context.SaveChanges(acceptAllChangesOnSuccess: false)