有些情況需要 新增/修改/刪除 多筆資料,但是又需要確保全部一起完成,如果有其中一個失敗就要讓其他資料復原。例如建立訂單主檔和訂單明細檔,先建立完訂單主檔後如果訂單明細檔建立失敗就要把訂單主檔刪除,實際執行時有點麻煩,不過我們可以透過交易(Transaction)很輕易的達成。
本次示範非常偷懶,直接寫在 Controller 內,如果有時間的話請一定要分層
上面的範例是先建立 Order ,儲存進資料庫後取得資料庫產生的 Id,然後再建立 OrderDetail ,填入 Order 的 Id ,然後儲存進資料庫。如果成功就會 Commit ,出現例外就 Rollback ,非常的簡單。
參考資料:
Microsoft.Learn - Using Transactions
本次示範非常偷懶,直接寫在 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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com