private void HandleDbUpdateConcurrencyExceptionReload(object[] paras, BuildDbUpdateConcurrencyExceptionFormatStringEventHandler stringHandler1, DbUpdateConcurrencyException db) { //先记录Debug日志 string temp = stringHandler1.Invoke(paras, db); LogHelper.Debug(temp); System.Diagnostics.Debug.WriteLine(temp); //发现并发异常,先通过异常对象抓到哪个对象的当前值与数据库不一致 if (db != null && db.Entries != null && db.Entries.Count() > 0) {//对所有不一致的对象,都把他们的“原始值”置为数据库的值 var entries = db.Entries.ToArray(); foreach (var entry in entries) { var dbvalues = entry.GetDatabaseValues(); var originValues = entry.OriginalValues; var currentValues = entry.CurrentValues; entry.OriginalValues.SetValues(entry.GetDatabaseValues()); entry.Reload();//最后重新加载对象,变成unchanged状态 } } }
internal IdentityResult HandleAndAction(IPrivilegeAsyncImpl asyncImpl, object[] paras) { CoreActionEventHandler coreAction = asyncImpl.CoreAction; BuildDbUpdateConcurrencyExceptionFormatStringEventHandler stringHandler1 = asyncImpl.DbUpdateConcurrencyExceptionFormatStringBuilder; BuildErrorFormatStringEventHandler stringHandler2 = asyncImpl.ErrorFormatStringBuilder; IdentityResult taskResult = null; int counter = 5; //通过配置,设定一个尝试的初始值,暂时写死5 while (taskResult == null && counter > 0) { try { IdentityResult identResult = coreAction.Invoke(paras); //Task<IdentityResult> tresult = coreAction.Invoke(paras); //tresult.Wait(); var result = identResult;// tresult.Result; if (result != null && result.Succeeded) { taskResult = IdentityResult.Success; //Task<IdentityResult>.Run( //() => //{//保证返回非空的Task结果对象 // return IdentityResult.Success; //} //); ////如果到这里都没有报错,说明已经添加成功无异常,可以直接返回 break; } } catch (DbUpdateConcurrencyException db) { HandleDbUpdateConcurrencyExceptionReload(paras, stringHandler1, db); } catch (AggregateException taskException) { LogHelper.Error("ApplicationUserManager.HandleAndAction Exception: ", taskException); if (taskException.InnerException != null) { LogHelper.Error("ApplicationUserManager.HandleAndAction InnerException: ", taskException.InnerException); if (taskException.InnerException is DbUpdateConcurrencyException) { HandleDbUpdateConcurrencyExceptionReload(paras, stringHandler1, taskException.InnerException as DbUpdateConcurrencyException); } } } //在这里出来就是要么没有异常,要么异常已经被处理,无论如何先减Counter避免死循环 counter--;//如果Counter未为0,则继续尝试直到不爆这个异常 } if (taskResult == null) { return(HandleNonCatchedExceptionReturn(paras, stringHandler2)); } return(taskResult); }