ASP.NET如何将2个dbContext.SaveChanges()放入单个事务中?

时间:2017-02-19 08:11:57

标签: c# asp.net

我有一个Job表,我将使用新插入的Job.Id来插入另一个名为CompanyJobs的表

要插入我做的工作

var job = new Job{Name = "Name"}
dbContext.Jobs.Add(job);
dbContext.SaveChanges();

然后使用新插入的作业,我使用它的ID插入CompanyJobs

var companyJobs = new CompanyJob{Name="Name",JobId = Job.Id};
dbContext.CompanyJobs.Add(companyJobs);
dbContext.SaveChanges();

假设插入CompanyJobs有可能出错

如何在一个事务中包含2个dbContext.SaveChanges()?

2 个答案:

答案 0 :(得分:1)

另一个选择是使用TransactionScope:

using (var transactionScope = new TransactionScope()) 
{ 
    var job = new Job{Name = "Name"}
    dbContext.Jobs.Add(job);
    dbContext.SaveChanges();

    var category = dbContext.Categories.Find(2);
    job.Categories.Add(category);
    dbContext.SaveChanges();

    transactionScope.Complete(); 
} 

如果退出Complete块时未调用using(即:发生异常),则回滚事务。

如果您正在使用异步方法,则需要将TransactionScopeAsyncFlowOption.Enabled参数传递给Transactionscope的构造函数。

答案 1 :(得分:0)

首先,您不需要两个SaveChanges,您可以在一个电话中同时执行这两项操作:

var category = dbContext.Categories.Find(2);
var job = new Job{Name = "Name"}
job.Categories.Add(category);
dbContext.Jobs.Add(job);
dbContext.SaveChanges();

如果你真的需要两笔交易,那么根据this docs你应该:

using (var dbContextTransaction = dbContext.Database.BeginTransaction()) 
{ 
    try 
    { 
        var job = new Job{Name = "Name"}
        dbContext.Jobs.Add(job);
        dbContext.SaveChanges();

        var category = dbContext.Categories.Find(2);
        job.Categories.Add(category);
        dbContext.SaveChanges();

        dbContextTransaction.Commit(); 
    } 
    catch (Exception) 
    { 
        dbContextTransaction.Rollback(); 
    } 
}