Entity Framework 4.0并发处理的步骤

新用到了实体框架,用到了并发,参考以下的图书资料

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并发控制的时间戳

clip_image002

注意:

并发控制不一定非要加时间戳,如果不加时间戳,那需要把那个每次更新的字段的并发模式设置为Fixed. 一般的使用加时间戳比较方便

生成数据库

这个是VS2010新加的功能,vs2008 sp1没有这个功能,很好用,可以实现从模型进行开始设计

clip_image004

如上,模型上右键,可以生成数据库脚本,不过这个生成的脚本对于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();

}
posted @ 2010-06-11 20:30  2012  阅读(2065)  评论(0编辑  收藏  举报