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[])
Заметки Если локальной транзакции нет, для выполнения команды будет использоваться новая транзакция.