Вложенные транзакции с MySQL и ядром Entity Framework - PullRequest
0 голосов
/ 02 января 2019

Я использую 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();
            }
        }
     }

Может кто-нибудь помочь мне, пожалуйста?

...