通过UserManager使用ExecuteInTransaction

问题描述 投票:0回答:1

我们正在实现EnableRetryOnFailure,但正如https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-resiliency所讨论的那样,对于用户定义的事务而言,这不是开箱即用的。

来自上述链接(选项3和4)的建议之一是使用ExecutionStrategy.ExecuteInTransaction,并使用SaveChanges调用acceptAllChangesOnSuccess: false

这是必需的,以便在SaveChanges成功但事务失败时可以重试事务。

[我们遇到的问题是,我们在事务中包含了UserManager方法,这些方法将在上下文中内部调用SaveChanges

当我们无法将UserManager更改为使用acceptAllChangesOnSuccess: false时该如何做?

.net-core ef-core-2.1 usermanager
1个回答
1
投票

使用UserManager.CreateUser方法添加用户将在内部UserStore上调用SaveChanges方法。UserStore类具有一个公共属性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(user)(不调用SaveChanges)
  3. context.SaveChanges(acceptAllChangesOnSuccess:false)
© www.soinside.com 2019 - 2024. All rights reserved.