Entity Framework Core 7 建立交易 使資料變更不可分割

有些情況需要 新增/修改/刪除 多筆資料,但是又需要確保全部一起完成,如果有其中一個失敗就要讓其他資料復原。例如建立訂單主檔和訂單明細檔,先建立完訂單主檔後如果訂單明細檔建立失敗就要把訂單主檔刪除,實際執行時有點麻煩,不過我們可以透過交易(Transaction)很輕易的達成。

本次示範非常偷懶,直接寫在 Controller 內,如果有時間的話請一定要分層
    
[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
    private readonly ApplicationDbContext _context;

    public TestController(ApplicationDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public ActionResult Test()
    {
        using (var transaction = _context.Database.BeginTransaction())
        {
            try
            {
                Order order = new()
                {
                    Date = DateTime.Now,
                    Data = "Test",
                };
                
                _context.Orders.Add(order);
                _context.SaveChanges();
                
                OrderDetail orderDetail = new()
                {
                    OrderId = order.Id,
                    Data = "Test",
                }; 
                
                _context.OrderDetails.Add(order);
                _context.SaveChanges();
                
                transaction.Commit(); // 執行交易
            }
            catch (Exception e)
            {
                transaction.Rollback(); // 復原
            }
        }

        return Ok("Test");
    }
}
    

上面的範例是先建立 Order ,儲存進資料庫後取得資料庫產生的 Id,然後再建立 OrderDetail ,填入 Order 的 Id ,然後儲存進資料庫。如果成功就會 Commit ,出現例外就 Rollback ,非常的簡單。

參考資料:
Microsoft.Learn - Using Transactions

留言