Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存集合时处理实体框架中事务的并发性_C#_Entity Framework - Fatal编程技术网

C# 保存集合时处理实体框架中事务的并发性

C# 保存集合时处理实体框架中事务的并发性,c#,entity-framework,C#,Entity Framework,我希望使用相同的dbContext来保存程序类型对象的集合,但如果任何程序对象中存在任何异常或并发异常,我希望回滚整个保存的集合,并需要通知用户发生并发问题的所有程序对象。我使用的是实体框架6.1 查找代码段。我面临的问题是,如果任何程序对象出现并发异常,那么即使下一条记录没有任何并发问题,programContext对象也会再次抛出相同的异常。请对此进行指导,如果这是错误的,那么我们如何在EF6.1中实现它 //Code public List<ProgramViewModel>

我希望使用相同的dbContext来保存程序类型对象的集合,但如果任何程序对象中存在任何异常或并发异常,我希望回滚整个保存的集合,并需要通知用户发生并发问题的所有程序对象。我使用的是实体框架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;
    } 
//代码
公共列表保存程序(列出新建和更新的程序)
{
列表失败程序=新列表();
使用(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中,如下所示: