遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

EF的乐观并发控制

1.在数据表中加一列TimeStamp类型的列,

2.在EDMX中设置改列为Fixed

典型代码:

View Code
            catch (OptimisticConcurrencyException cex)
            {

                Debug.WriteLine(DateTime.Now +"冲突错误处理中的TimeStamp");
                Debug.WriteLine("刷新前:" + BitConverter.ToString((cex.StateEntries[0].Entity as KB_BOMTable).TimeStamp));
                MessageBox.Show(string.Format("BOM编号:{0},的记录已经被其他用户修改,请确认情况后再做处理!", (cex.StateEntries[0].Entity as KB_BOMTable).BOMId), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                DBCtx.Refresh(System.Data.Objects.RefreshMode.StoreWins, cex.StateEntries[0].Entity);
                Debug.WriteLine("刷新后:" +BitConverter.ToString((cex.StateEntries[0].Entity as KB_BOMTable).TimeStamp));
                Debug.WriteLine("会话中:" + BitConverter.ToString((DBCtx.GetObjectByKey(cex.StateEntries[0].EntityKey) as KB_BOMTable).TimeStamp));


                object lateEnt;

                DBCtx.TryGetObjectByKey(new EntityKey("JL_MFGEntities.KB_BOMTable", "BOMId", "0002"), out lateEnt);

                Debug.WriteLine(DateTime.Now + ",再次看会话中的TimeStamp");
                Debug.WriteLine(BitConverter.ToString((lateEnt as KB_BOMTable).TimeStamp));
                Debug.WriteLine("End<-");
            }

 

采用EDMX的方式进行建模,DBCtx.Refresh方法参数一说明

RefreshMode.StoreWins: StoreWins表示发生并发冲突时按数据库中的取值,来替换当前会话中的对象(DBCtx),TimeStamp列会变成数据库中的取值

RefreshMode.ClientWins: ClientWins表示发生并发冲突时保留客户端的取值(TimeStamp列不会变),但是Refresh方法实际上会获取数据库中的当前对象对应的记录(Store.TimeStamp),在下次提交该记录时,Store.TimeStamp会用到update更新语句中,而不是使用对象本身的TimeStamp列取值。

posted on 2012-06-14 20:42  遗忘海岸  阅读(2257)  评论(0编辑  收藏  举报