回滚.net实体框架中的事务
本文关键字:事务 框架 net 实体 回滚 | 更新日期: 2023-09-27 18:11:45
我有一个MVC动作控制器方法为:
public ActionResult Register(ViewModel.User model)
{
DbContextTransaction dbTransaction = null;
if (ModelState.IsValid)
{
try
{
UserAccountLogic registerUser = new UserAccountLogic();
dbTransaction = registerUser.RegisterUser(model);
Mail.SendEmail(model.Email, model.FirstName);
dbTransaction.Commit();
//Session["Email"] = model.Email;
ViewBag.Style = "block";
}
catch (Exception e)
{
dbTransaction.Rollback();
log.Error(e.Message, e);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
RegisteredUser函数在业务层为:
public DbContextTransaction RegisterUser(User model)
{
//var userEntity = Mapper.Map<User, Dal.UserInfo>(model);
var userEntity = MapModelToEntity(model);
var registerService = new Dal.AccountService();
return registerService.SaveRegisterDetails(userEntity);
}
和SaveRegisterDetails函数是在DataAccessLayer作为:
public DbContextTransaction SaveRegisterDetails(UserInfo registerDetails)
{
//TransactionModel transactionModel = new TransactionModel();
using (HealthCarePortalEntities context = new HealthCarePortalEntities())
{
using (DbContextTransaction dbTran = context.Database.BeginTransaction())
{
context.UserInfo.Add(registerDetails);
context.SaveChanges();
return dbTran;
}
}
现在我的问题是我想回滚一个事务,即一个新注册的用户数据从数据库当有任何异常发送激活链接到用户。但问题是部分,我正在做回滚异常抛出,因为数据库连接是空的。所以我的问题是我怎么能得到连接的DAL层的控制器是在另一层。谢谢你的帮助。
您只需要实现IDisposable
private void Dispose(bool disposing)
{
// ...
if (disposing && (this._innerConnection != null))
{
this._disposing = true;
this.Rollback(); // there you go
}
}
实现IDisposable
您可以使用环境事务模型。
using(TransactionScope tran = new TransactionScope()) {
UserAccountLogic registerUser = new UserAccountLogic();
dbTransaction = registerUser.RegisterUser(model);
Mail.SendEmail(model.Email, model.FirstName);
tran.Complete();
}
这样,如果在事务范围内发生异常,数据库将回滚数据。