通过WCF 服务 使用 EntityFramework5.0 CodeFirst方式 通过 DTO Automapper 更新实体的并发控制
来源:互联网 发布:unity3d就业前景 知乎 编辑:程序博客网 时间:2024/05/21 18:47
我们在项目中会使用DTO作为数据业务领域模型来传输,在更新的时候会考虑并发问题,这里我只说下乐观并发控制。
首先我们在数据库表中增加一个 Timestamp类型的列 TS 作为版本控制
我使用的是CodeFirst方式,通过EF Power Tools 生成Model实体(具体生成方法可以百度一下),在Mapping类里我们可以看到EF 自动把这个TS列作为了 RowVersion
this.Property(t => t.TS) .IsFixedLength() .HasMaxLength(8) .IsRowVersion();
有了这个属性,我们在更新的时候EF 会自动生成一个where 条件, where 主键='xxxx' and TS = 'xxxxxxxxxxxxx' 的条件
然后重点来了,我们把DTO传给WCF服务,通过主键获取到实体,然后用Automapper 将更新对象映射到原实体上,进行Attatch, 最后调用SaveChange,如果并发操作,我们会得到一个 DbUpdateConcurrencyException 并发操作异常。关键代码如下
业务层的更新方法
public void EditItem(DTO.DTO_EDIT_ITEM item) { ITEM oraItem = curdItem.GetByID(item.ITEM_GID); oraItem = AutoMapper.Map<DTO_EDIT_ITEM, ITEM>(item, oraItem); curdItem.Update(oraItem); unitofWork.Commit(); }
Curd的Update方法
public virtual void Update(T entity) { context.Set<T>().Attach(entity); context.Entry(entity).State = System.Data.EntityState.Modified; }
public void Commit() { try { DataContext.SaveChanges(); } catch (DbUpdateConcurrencyException ex) { //并发处理控制,捕获并发异常信息,以业务异常抛出 throw new BusinessException("数据已经被更改,请重新加载操作"); } }
- 通过WCF 服务 使用 EntityFramework5.0 CodeFirst方式 通过 DTO Automapper 更新实体的并发控制
- 通过fastjson返回顺序的dto实体属性
- 通过jsonp调用wcf服务的例子
- [WCF权限控制]通过扩展自行实现服务授权
- 回调与并发: 通过实例剖析WCF基于ConcurrencyMode.Reentrant模式下的并发控制机制
- 通过jQuery以HTTP GET/POST方式调用WCF服务
- Android通过GET和POST方式访问WCF服务(Json)
- WCF服务通过 SvcUtil.exe 方式调用,WCF半动态调用
- 使用OAuth方式保护你的WCF Service(通过Azure ACS)
- .NET的DTO映射工具AutoMapper
- 通过Ajax的方式执行GP服务
- 通过Ajax的方式执行GP服务
- 通过IIS承载WCF服务注意事项
- WCF :通过配置文件来托管服务
- Silverlight通过ISA访问WCF服务
- BCS 通过WCF连接web服务 参考资料
- wcf之三(通过文件部署服务)
- 通过泛型插入(更新)实体数据
- 正态分布随机数生成
- Codesite Studio 5.x 最新支持Delphi XE 6,VS 2013
- Hadoop DataNode启动之heartbeat
- 二叉堆
- js删除元素
- 通过WCF 服务 使用 EntityFramework5.0 CodeFirst方式 通过 DTO Automapper 更新实体的并发控制
- Github之“会说话”丝带
- 浅谈JNI的使用--java调用dll(原创)
- Hibernate 级联保存TransientObjectException object references an unsaved transient instance
- Android:startActivityForResult 和 onActivityResult 问题
- .htaccess实例
- 小函数,大问题(strcpy,sprintf,strcat)
- appendChild() 或 insertBefore()使用与区别
- 数据库设计规范化的五个要求 推荐收藏