在保存集合的同时处理实体框架中的事务并发

时间:2014-12-18 05:32:27

标签: c# entity-framework

我想使用相同的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;
    } 

1 个答案:

答案 0 :(得分:0)

要回滚,请尝试以下代码:

if (isErrorOccured)
{
    programContext.ChangeTracker.Entries().ToList().ForEach(entry => entry.State = EntityState.Unchanged);
}