【发布时间】:2017-09-16 11:49:04
【问题描述】:
我想更新一些值,但万一失败,我需要回滚。如何在 asp.net-core-2.0 中做到这一点?
我还没有找到任何答案。这是因为它还不支持吗?在那种情况下,有哪些替代方案?
【问题讨论】:
-
谢谢,我不知道我是怎么错过的。
标签: transactions asp.net-core-2.0
我想更新一些值,但万一失败,我需要回滚。如何在 asp.net-core-2.0 中做到这一点?
我还没有找到任何答案。这是因为它还不支持吗?在那种情况下,有哪些替代方案?
【问题讨论】:
标签: transactions asp.net-core-2.0
//--INSIDE YOUR SAVE METHOD--
using (var context = new YOURContext())
{
using (var transaction = context.Database.BeginTransaction()) //--Startind transactions
{
try
{
context.YourObject1.Add(new YourObject1 { Url = "http://blogs.msdn.com/dotnet" });
context.SaveChanges();
context.YourObject2.Add(new YourObject2 { Url = "http://blogs.msdn.com/visualstudio" });
context.SaveChanges();
// Commit transaction if all commands succeed, transaction will auto-rollback
// when disposed if either commands fails
transaction.Commit();
}
catch (Exception)
{
// TODO: Handle failure
}
}
}
注意更新,首先恢复对象,然后更新。
//--INSIDE YOU UPDATE METHOD--
...
if (ModelState.IsValid)
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
var dataYourObj1 = await _context.YourObj1.SingleAsync(x => x.Id == YourObj1.Id);
dataYourObj1.Name = obj1.Name;
dataYourObj1.Email = obj1.Email;
await _context.SaveChangesAsync();
var dataYourObj2 = await _context.YourObj2.SingleAsync(x => x.Id == dataYourObj2.Id);
dataYourObj2.field = obj2.Field;
await _context.SaveChangesAsync();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine("Error occurred." + ex);
}
return RedirectToAction(nameof(Index));
}
}
【讨论】:
默认情况下,如果数据库提供程序支持事务,则对 SaveChanges 的一次调用中的所有更改都会应用到事务中。如果任何更改失败,则事务将回滚,并且不会将任何更改应用于数据库。这意味着 SaveChanges 保证要么完全成功,要么在发生错误时保持数据库不变。 对于大多数应用程序,此默认行为就足够了。只有在您的应用程序要求认为有必要时,您才应该手动控制事务。
例如:
var user = new User { Email = "email", UserName = "username" }; dbContext.Users.Add(user); dbContext.Users.Add(new UserRole { RoleId = 1, UserId = user.id }); await dbContext.SaveChangesAsync();
更多信息见以下链接:
https://docs.microsoft.com/en-us/ef/core/saving/transactions
【讨论】:
是的,伙计,使用 System.Transactions.TransactionScope,从 .Net Core 2.0 及更高版本开始可用。检查这个:
在 ASP.NET 中使用 System.Transactions: https://msdn.microsoft.com/en-us/ms229977
使用事务范围实现隐式事务: https://msdn.microsoft.com/en-us/ms172152
【讨论】: