实体框架中的一个事务中的许多更新语句

时间:2012-07-02 07:19:19

标签: asp.net-mvc-3 c#-4.0 entity-framework-4.1

我需要更新多个更新语句,但所有更新语句都应该工作,即全部更新或不更新。

在互联网和其他SO问题我已经找到了如何使用事务但我没有找到任何人说在一个事务中更新多个语句。 请参阅以下三个更新语句,目前尚未在事务

下运行
/// this are my update calls.
var report = reportRepository.Update(reportModel);
var book = bookRepository.Update(bookModel);
var mobile = mobileRepository.Update(mobileModel);

// each Update method for all repository will looks like
public returnModel Update(someModel model)
{
    // assign values from model to entity
    Context.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState.Modified)
    Context.SaveChanges();
}

3 个答案:

答案 0 :(得分:4)

您可以将更新包装在TransactionScope

using (TransactionScope transaction = new TransactionScope())
{
    var report = reportRepository.Update(reportModel);
    var book = bookRepository.Update(bookModel);
    var mobile = mobileRepository.Update(mobileModel);
    ...
    transaction.Complete();
}

答案 1 :(得分:1)

正如Darin所提到的,使用事务范围或我首选的方法是让您的存储库属于IUnitOfWork接口。调用更新只是将状态设置为已修改,并且SaveChanges发生在存储库的外部以立即保存所有更改。 这应该在一个事务中自动发生。

因此,您调用所有更新,然后调用unitOfWork.SaveChanges,其中您的自定义工作单元类包含对您的上下文的引用,并实现在IUnitOfWork中定义的方法Save()

答案 2 :(得分:0)

基本上你需要通过TransactionScope Class来管理它,使用它你可以设置模型的多个更新,然后使用Transaction.Complete将你的东西保存在一个事务中。

请查看Updating multiple objects in single transaction in entity framework了解详情。