C# 保存集合时处理实体框架中事务的并发性
我希望使用相同的dbContext来保存程序类型对象的集合,但如果任何程序对象中存在任何异常或并发异常,我希望回滚整个保存的集合,并需要通知用户发生并发问题的所有程序对象。我使用的是实体框架6.1 查找代码段。我面临的问题是,如果任何程序对象出现并发异常,那么即使下一条记录没有任何并发问题,programContext对象也会再次抛出相同的异常。请对此进行指导,如果这是错误的,那么我们如何在EF6.1中实现它C# 保存集合时处理实体框架中事务的并发性,c#,entity-framework,C#,Entity Framework,我希望使用相同的dbContext来保存程序类型对象的集合,但如果任何程序对象中存在任何异常或并发异常,我希望回滚整个保存的集合,并需要通知用户发生并发问题的所有程序对象。我使用的是实体框架6.1 查找代码段。我面临的问题是,如果任何程序对象出现并发异常,那么即使下一条记录没有任何并发问题,programContext对象也会再次抛出相同的异常。请对此进行指导,如果这是错误的,那么我们如何在EF6.1中实现它 //Code public List<ProgramViewModel>
//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;
}
//代码
公共列表保存程序(列出新建和更新的程序)
{
列表失败程序=新列表();
使用(ProgramContext ProgramContext=new ProgramContext())
{
使用(DbContextTransaction dbProgramTransaction=programContext.Database.BeginTransaction())
{
bool-iserrorOccursed=false;
foreach(newandupdated程序中的var项)
{
尝试
{
程序=新程序();
program.ProgramID=item.ProgramID;
program.Title=item.Title;
program.ProgramCode=item.ProgramCode;
program.Description=项目.Description;
//这是为了检查用户是否有最新记录或脏记录(一致性检查)
program.RowVersion=System.Convert.FromBase64String(item.RowVersion);
if(program.ProgramID==0)
programContext.Entry(program).State=System.Data.Entity.EntityState.Added;
其他的
programContext.Entry(program).State=System.Data.Entity.EntityState.Modified;
programContext.SaveChanges();//在此处引发上一个并发异常
}
捕获(DbUpdateConcurrencyException ex)
{
ISErrorOccursed=true;
失败的程序。添加(项);
}
}
如果(发生错误)
{
dbProgramTransaction.Rollback();
}
其他的
{
dbProgramTransaction.Commit();
}
}
}
返回失败的程序;
}
要回滚,请尝试以下代码:
if (isErrorOccured)
{
programContext.ChangeTracker.Entries().ToList().ForEach(entry => entry.State = EntityState.Unchanged);
}
将foreach放在try/catchMore on concurrency中,如下所示: