Database.ExecuteSqlCommandAsync транзакция автоматического принятия?

У меня есть сомнения, _context.Database.ExecuteSqlCommandAsync Метод автоматического подтверждения транзакции или нет.

Мой код выглядит так:

using (DatabaseContext _db = new DatabaseContext())
{
     using(var _transaction = _db.Database.BeginTransaction())
     {
          try
          {
              await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
              _transaction.Commit();
          }
          catch(Exception ex)
          {
              _transaction.Rollback();
              throw;
          }
     }
}

Я предполагаю, что метод не выполняет автоматическую фиксацию транзакции, поэтому я решил зафиксировать ее вручную.

Это хорошая практика? Или нет необходимости делать это?

1 ответ

Решение

Нет, вам не нужно фиксировать ExecuteSqlCommandAsync, но, поскольку это напрямую записывает базу данных, сущности, отслеживаемые EF, могут быть устаревшими.

Чтобы противостоять этому, просто удалите и переделайте контекст:

using (DatabaseContext _db = new DatabaseContext())
{
   await _db.Database.ExecuteSqlCommandAsync(query, paramsList);
}
using (DatabaseContext _db = new DatabaseContext())
{
   var itemsJustInserted = _db.Items.ToList(); //should have your modified items
}

Нет, не надо..

ExecuteSqlCommandAsync(String, CancellationToken, Object[])

Заметки Если локальной транзакции нет, для выполнения команды будет использоваться новая транзакция.

https://docs.microsoft.com/en-us/dotnet/api/system.data.entity.database.executesqlcommandasync?view=entity-framework-6.2.0

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