如何在原始查询中使用实体框架事务?

bar*_*oma 5 entity-framework transactionscope entity-framework-core

我正在使用实体框架,但使用原始查询进行操作。我的操作如下:

\n
    \n
  1. 检查rec\xc4\xb1rd 是否存在且具有integration_id
  2. \n
  3. 退出则删除记录
  4. \n
  5. 插入新记录
  6. \n
\n

所以我正在使用交易

\n
using (var transaction = await _context.Database.BeginTransactionAsync())\n{ \n        var isExist = await IsExist(id);\n\n        if (isExist)\n        {\n              var deleteQuery = "delete from ....";\n              await _context.Database.ExecuteSqlRawAsync(deleteQuery);\n        }\n\n        var insertQuery = "insert into ...";\n        await _context.Database.ExecuteSqlRawAsync(insertQuery);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

如果插入操作失败,删除的记录是否回滚?

\n

orn*_*nic 3

UPD:https://learn.microsoft.com/en-us/ef/core/ saving/transactions#controlling-transactions

如果任一命令失败,事务将在处理时自动回滚

所以,我下面的代码在 catch 方面可能有点过分了,但 Commit 仍然是必要的:)

=====================

我认为使用事务的正确方法如下:

using (var transaction = await _context.Database.BeginTransactionAsync())
{
    try
    {
        var isExist = await IsExist(id);

        if (isExist)
        {
            var deleteQuery = "delete from ....";
            await _context.Database.ExecuteSqlRawAsync(deleteQuery);
        }

        var insertQuery = "insert into ...";
        await _context.Database.ExecuteSqlRawAsync(insertQuery);

        // there we tell DB to finish the transaction,
        // mark all changes as permanent and release all locks
        transaction.Commit();
    }
    catch (Exception ex)
    {
        // there we tell DB to discard all changes
        // made by this transaction that may be discarded
        transaction.Rollback();
        // log error
    }
}
Run Code Online (Sandbox Code Playgroud)

但我BeginTransaction*Async*个人以前从未使用过。