Использование ExecuteInTransaction с UserManager - PullRequest
0 голосов
/ 16 января 2020

Мы внедряем 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?

1 Ответ

1 голос
/ 13 марта 2020

Добавление пользователя с помощью метода UserManager.CreateUser вызовет метод SaveChanges во внутреннем хранилище UserStore. Класс UserStore имеет свойство publi c 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.CreateAsyn c (пользователь) (без вызова SaveChanges)
  3. context.SaveChanges (acceptAllChangesOnSuccess: false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...