我有一个工作表,我将使用新插入的作业。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();
}
}