注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gb.qin

A Man's心靈的港灣

 
 
 

日志

 
 

EF乐观并发处理--ContosoUniversity改造  

2015-06-09 10:03:17|  分类: EF+Migration |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Controller层 using ContosoUniversity.Helper;
try
            {
                if (ModelState.IsValid)
                {
                    db.Entry(department).State = EntityState.Modified;
                    await db.SaveChangesAsync();
                    return RedirectToAction("Index");
                }
            }
            catch (DbUpdateConcurrencyException ex)
            {
                //调用helper
                ConcurrencyExceptionHelper.ConcurrencyException<Department>(ex, this);
                department.RowVersion = ((Department)ex.Entries.Single().GetDatabaseValues().ToObject()).RowVersion;               
            }
            catch (RetryLimitExceededException /* dex */)
            {
                //Log the error (uncomment dex variable name and add a line here to write a log.
                ModelState.AddModelError(string.Empty, "无法保存更改,请重试或联系管理员。");
            }

            ViewBag.InstructorID = new SelectList(db.Instructors, "ID", "FullName", department.InstructorID);
            return View(department);
===========================================================================================
ConcurrencyExceptionHelper类
    public static class ConcurrencyExceptionHelper
    {
        public static void ConcurrencyException<T>(DbUpdateConcurrencyException ex, Controller PramController)
        {
            var entry = ex.Entries.Single();
            var clientValues = entry.Entity;
            var databaseEntry = entry.GetDatabaseValues();
            if (databaseEntry == null)
            {
                PramController.ModelState.AddModelError(string.Empty,
                    "无法保存更改,已经被其他用户删除。");
            }
            else
            {
                var databaseValues = (T)databaseEntry.ToObject();
                //获取当前对象的属性数组
                PropertyInfo[] currentPro = clientValues.GetType().GetProperties();
                //获取原始对象的属性数组
                PropertyInfo[] databasePro = databaseValues.GetType().GetProperties();
                foreach (PropertyInfo current in currentPro.Where(p => !string.IsNullOrEmpty(p.Name)))
                {
                    //获取当前数据
                    object currentColumnValue = current.GetValue(clientValues, null);
                    //获取原始数据
                    object databaseColumnValue = current.GetValue(databaseValues, null);  
                    if (currentColumnValue != null) {
                        if (!databaseColumnValue.Equals(currentColumnValue))
                        {
                            PramController.ModelState.AddModelError(current.Name,
                            "当前值:" + databaseColumnValue.ToString());
                        }
                    }
                }
                PramController.ModelState.AddModelError(string.Empty, "当前记录已经被其他人更改。如果你仍然想要保存这些数据,"
                    + "重新点击保存按钮或者点击返回列表撤销本次操作。");
            }
        }
    }
  评论这张
 
阅读(279)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017