Я использую 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();
}
}
}
Может кто-нибудь помочь мне, пожалуйста?