新用到了实体框架,用到了并发,参考以下的图书资料
Entity Framework 4.0 Recipes A Problem-Solution Approach
ISBN-13 (pbk): 978-1-4302-2703-8
ISBN-13 (electronic): 978-1-4302-2704-5
http://apress.com/book/view/1430227036
具体的步骤如下:
建立模型
添加Ado.net Entity Model后类似如下添加TimeStamp并发控制的时间戳
注意:
并发控制不一定非要加时间戳,如果不加时间戳,那需要把那个每次更新的字段的并发模式设置为Fixed. 一般的使用加时间戳比较方便
生成数据库
这个是VS2010新加的功能,vs2008 sp1没有这个功能,很好用,可以实现从模型进行开始设计
如上,模型上右键,可以生成数据库脚本,不过这个生成的脚本对于TimeStamp字段的处理有些问题,默认模型生成的字段不是timestamp数据库类型[应该可以在SSDLToSQL10.tt文件中修改,没有试验],可以采用以下方法处理,新加一个sql文件,类似如下:
alter table DemoSet drop COLUMN [TimeStamp]
alter table DemoSet add [TimeStamp] timestamp not null
以后从模型更新数据库时只要先运行生成的sql脚本,再运行一下这个脚本就行了
并发处理
using (TestContainer context = new TestContainer()) { //新加一个记录 Demo d = new Demo() { Name = "a", Phone = "123" }; context.DemoSet.AddObject(d); context.SaveChanges(); //使用SQL执行一个更新模拟并发的情况 d = context.DemoSet.First(); context.ExecuteStoreCommand(@"update DemoSet set Phone='456' where Id = @p0", new object[] { d.Id }); ///出现并发冲突的处理 try { d.Phone = "321"; ///也可以强制采用最后一次的更新为准的方式,如下屏蔽的两行 ///context.DemoSet.MergeOption = MergeOption.PreserveChanges; ///d = context.DemoSet.First(p => p.Id == d.Id); context.SaveChanges(); Console.WriteLine("No concurrency exception."); } catch (OptimisticConcurrencyException) { try { context.Refresh(RefreshMode.ClientWins, d); context.SaveChanges(); } catch (OptimisticConcurrencyException) { //在大量用户时,处理的瞬间,别人又更新了,此时可以继续处理 } } //清理数据库 d = context.DemoSet.First(); context.DeleteObject(d); context.SaveChanges(); }