【问题标题】:Using ExecuteInTransaction with UserManager将 ExecuteInTransaction 与 UserManager 一起使用
【发布时间】:2020-05-03 14:31:15
【问题描述】:

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

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

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

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

当我们无法将UserManager 更改为使用acceptAllChangesOnSuccess: false 时,我们该怎么做?

【问题讨论】:

    标签: .net-core ef-core-2.1 usermanager


    【解决方案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. 将 UserStore.AutoSaveChanges 属性设置为 false。
    2. userManager.CreateAsync(user)(不调用 SaveChanges)
    3. context.SaveChanges(acceptAllChangesOnSuccess: false)

    【讨论】:

    • 请添加几行解释。
    猜你喜欢
    • 2017-06-12
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多