Вложенные транзакции с MySQL и ядром Entity Framework

Я использую MySQL с EF Core. В настоящее время я использую Pomelo Provider для MySQL. Мне нужно реализовать шаблон единицы работы для транзакций. У меня есть служба, которая вызывает два метода в хранилище. Я не могу реализовать вложенные транзакции. Вот как теперь выглядит мой метод в сервисе:

    public void methodA(param)
    {
      using (TransactionScope tx = new 
        TransactionScope(TransactionScopeOption.Required))
        {
          repo1.save(data1);
          repo2.save(data2);
          tx.complete();
        }
    }

Вот как реализован метод сохранения в repo1

    private readonly UserDbContext appDbContext;
    public repo1(UserDbContext _appDbContext)
    {
        appDbContext = _appDbContext;
    }
    public void save(User entity)
    {
        var dbset = appDbContext.Set<User>().Add(entity);
        appDbContext.SaveChanges();
    }

Вот как реализован метод сохранения в repo2

    private readonly UserDbContext appDbContext;
    public repo2(UserDbContext _appDbContext)
    {
        appDbContext = _appDbContext;
    }
    public void save(UserRole entity)
    {
        var dbset = appDbContext.Set<UserRole>().Add(entity);
        appDbContext.SaveChanges();
    }

Я получаю следующую ошибку при запуске метода в службе:

Сгенерирована ошибка для предупреждения 'Microsoft.EntityFrameworkCore.Database.Transaction.AmbientTransactionWarning: Обнаружена внешняя транзакция. Текущий поставщик не поддерживает внешние транзакции. См. http://go.microsoft.com/fwlink/?LinkId=800142'. Это исключение можно подавить или зарегистрировать, передав идентификатор события "RelationalEventId.AmbientTransactionWarning" методу "ConfigureWarnings" в "DbContext.OnConfiguring" или "AddDbContext".

Вот как я зарегистрировал UserDbContext в Startup.cs

    services.AddDbContext<UserDbContext>(options => options.UseLazyLoadingProxies().UseMySql("Server = xxxx; Database = xxx; Uid = xx;ConnectionReset=True;", b => b.MigrationsAssembly("AssemblyName")));

Я даже попытался добавить промежуточное программное обеспечение, которое запускает транзакцию в начале запроса и фиксирует / откатывает во время ответа. Но я все еще не могу управлять вложенными транзакциями.

Вот так выглядит мое промежуточное ПО:

    public class TransactionPerRequestMiddleware
    {
       private readonly RequestDelegate next_;

       public TransactionPerRequestMiddleware(RequestDelegate next)
        {
         next_ = next;
        }

       public async Task Invoke(HttpContext context, UserDbContext 
        userDbContext)
        {
           var transaction = userDbContext.Database.BeginTransaction(
           System.Data.IsolationLevel.ReadCommitted);

           await next_.Invoke(context);

           int statusCode = context.Response.StatusCode;
           if (statusCode == 200 || statusCode==302)
            {
            transaction.Commit();
            }
            else
            {
            transaction.Rollback();
            }
        }
     }

Кто-нибудь может мне помочь?

0 ответов

Другие вопросы по тегам