新用到了实体框架,用到了并发,参考以下的图书资料
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();
}