gpt4 book ai didi

c# - LINQ BeginTransaction 可以使用新的 Context 吗?

转载 作者:行者123 更新时间:2023-11-30 16:54:24 26 4
gpt4 key购买 nike

我的项目是用Ninject开发的,比如我写了2个函数Insert or Update to Database

public class PersonRepository : IPersonRepository {

private readonly DbContext _context;

public PersonRepository(DbContext context) {
_context = context;
}

public void InsertToDB(Person obj) {
_context.Persons.Add(obj);
_context.SaveChanges();
}

public void UpdateToDB(Person obj) {
_context.Persons.Attach(obj);
_context.SaveChanges();
}
}

在 Controller 中,我声明相同的 DbContext 并使用事务:

public class PersonController : Controller {

private readonly DbContext _context;
private readonly IPersonRepository _repository;

public PersonController(DbContext context, IPersonRepository repository) {
_context = context;
_repository = repository;
}

public ActionResult Index() {
return View();
}

[HttpPost]
public ActionResult ExecuteToDb(Person person1, Person person2) {
using (var transaction = _context.Database.BeginTransaction(IsolationLevel.ReadCommitted)) {
try {
_repository.InsertToDB(person1);
_repository.UpdateToDB(person2);

transaction.Commit();
} catch (Exception) {
transaction.RollBack();
}
}
}
}

那么如果InsertToDB()UpdateToDB()抛出任何异常,事务是否可以回滚?

我担心它,因为我认为 Controller 和 Repository 的 _context 不同,我现在无法测试它,帮助我,谢谢!

最佳答案

这里有三个选项。首先,您可以将 Ninject 配置为对 PersonController 和 PersonRepository 使用相同的 DbContext 实例。为此,您可以将绑定(bind)配置为使用 InRequestScope()。然后,您可以调用 BeginTransaction,它是相同的上下文。

或者,您可以只将 BeginTransaction、CommitTransaction 和 RollBackTrasaction 方法添加到我们的 IRepository 类,并在您的 Repository 中实现它们。

第三种选择是只创建一个新的 TransactionScope() 而不是在上下文中调用 BeginTransaction。

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, 
new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TransactionManager.MaximumTimeout }))
{
_repository.InsertToDB(person1);
_repository.UpdateToDB(person2);

// if exception occurs, Complete will not get called, so transaction
// is automatically rolled back when Dispose is called when using()
// goes out of scope. If Complete is called, then Commit is called.
scope.Complete();
}

关于c# - LINQ BeginTransaction 可以使用新的 Context 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com