.net Core 2.1 Идентификация, транзакции, используемые совместно со службами - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь использовать одну транзакцию для создания пользователя с помощью 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 должен быть расположен в том же потоке, в котором он был создан."

Есть идеи, чтобы транзакция работала без проблем?

...