我想使用相同的dbContext来保存Program类型对象的集合,但是如果任何程序对象中有任何异常或并发异常,我想回滚整个已保存的集合,并需要通知用户关于发生并发问题的所有程序对象。我正在使用Entity Framework 6.1。
找到代码段。我面临一个问题,如果任何程序对象有并发异常,那么即使下一条记录没有任何并发问题,programContext对象也会再次抛出相同的异常。如果错误,请指导一下,然后我们如何在EF6.1中实现它
//Code
public List<ProgramViewModel> SavePrograms(List<ProgramViewModel> newAndUpdatedPrograms)
{
List<ProgramViewModel> failedPrograms = new List<ProgramViewModel>();
using (ProgramContext programContext = new ProgramContext())
{
using (DbContextTransaction dbProgramTransaction = programContext.Database.BeginTransaction())
{
bool isErrorOccured = false;
foreach (var item in newAndUpdatedPrograms)
{
try
{
Program program = new Program();
program.ProgramID = item.ProgramId;
program.Title = item.Title;
program.ProgramCode = item.ProgramCode;
program.Description = item.Description;
//This is to check whether user is having the latest record or dirty record (Concurency check)
program.RowVersion = System.Convert.FromBase64String(item.RowVersion);
if (program.ProgramID == 0)
programContext.Entry(program).State = System.Data.Entity.EntityState.Added;
else
programContext.Entry(program).State = System.Data.Entity.EntityState.Modified;
programContext.SaveChanges(); //Throws the previous concurrency exception here
}
catch (DbUpdateConcurrencyException ex)
{
isErrorOccured = true;
failedPrograms.Add(item);
}
}
if (isErrorOccured)
{
dbProgramTransaction.Rollback();
}
else
{
dbProgramTransaction.Commit();
}
}
}
return failedPrograms;
}
答案 0 :(得分:0)
要回滚,请尝试以下代码:
if (isErrorOccured)
{
programContext.ChangeTracker.Entries().ToList().ForEach(entry => entry.State = EntityState.Unchanged);
}