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



我有一个工作表,我将使用新插入的作业。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()包装在一个交易中?

另一个选项是使用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(); 
} 

如果退出using块时未调用Complete(即发生异常),则交易已回滚。

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

首先,您不需要两个SaveChanges,您可以在一个呼叫中同时完成:

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

如果您确实需要两项交易,则根据此文档,您应该:

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(); 
    } 
} 

最新更新