Entity Framework 乐观并发处理
有一段时间没有更新博客了,今天终于有一些时间,和大家讨论一个Entity Framework 乐观并发处理的问题。首先需要说明的是,这里提到的 “并发” 并不是指的多线程处理,也就是笔者这里要讨论的是另外一个问题场景,这个场景描述如下:
1. 系统用户A从数据库中取得一条记录Record-1
2. 系统用户B从数据库中取得同一条记录Record-1
3. 系统用户B修改记录Record-1,并保存到数据库
4. 系统用户A修改记录Record-1,并保存到数据库
这个场景里面的问题是系统用户B对数据路记录Record-1的修改被A的修改冲掉了,这种行为在某些业务场景中是正确的,但是在某些场景中可能会有问题,因为这样的场景中A可能希望感知Record-1的变化,并做出相应的代码策略处理。
针对这种场景Entity Framework 专门有一种解决方案,Timestamp或者叫Rowersion,具体实现代码如下, 在需要支持乐观并发的model上增加Timestamp字段,字段的名字叫RowVersion,当然对应的数据库表上也要加上这个字段RowVersion,类型是timestamp, 这样在以上描述的场景发生时,系统就会捕获到相应的异常,从而有机会对这种场景进行相应的业务处理。
如果不喜欢Data Annotation,也可以使用 Fluent api 进行标记,具体代码如下,
modelBuilder.Entity<Department>().Property(p => p.RowVersion).IsRowVersion();