我有一个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()?
答案 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();
}
}