Я пытаюсь использовать одну транзакцию для создания пользователя с помощью Identity (UserManager), где User.Id
извлекается при предыдущем вызове службы.
ApplicationContext:
public class ApplicationContext : IdentityDbContext
Метод в Service
, в котором контекст Db передается путем инъекции, сохраните объект в таблице и получите уникальный сгенерированный идентификатор:
protected readonly ApplicationContext _applicationContext;
public Service(ApplicationContext applicationContext)
{
_applicationContext = applicationContext;
}
public async Task<long> CreateId()
{
var obj = new [....]
await _applicationContext.[....].AddAsync(obj);
await _applicationContext.SaveChangesAsync();
return obj.Id;
}
Controller
, где пользовательдолжен быть создан с использованием предыдущего идентификатора: (только для проверки, код всегда вызывает откат транзакции)
public AuthController(UserManager<User> userManager, IService service)
{
_service = service;
_userManager = userManager;
}
void MethodToCreateUser()
{
using(var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
try
{
// Get an Id
var createdId = await _entityService.CreateId();
// Create a user with that Id
var user = new User{Id = createdId };
// Go
var result = await _userManager.CreateAsync(user, model.Password);
// Yes! I want to dispose it, just for test
scope.Dispose();
[....]
Это использование TransactionScope
возвращает мне эту ошибку в методе CreateId
вслужба:
Сгенерирована ошибка для предупреждения 'Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransactionWarning: Обнаружена внешняя транзакция.Текущий поставщик не поддерживает внешние транзакции.
Итак, давайте изменим создание области действия в:
using(var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
Таким образом, я получаю эту ошибку в строке scope.Dispose()
:
"TransactionScope должен быть расположен в том же потоке, в котором он был создан."
Есть идеи, чтобы транзакция работала без проблем?