EF的乐观并发控制
1.在数据表中加一列TimeStamp类型的列,
2.在EDMX中设置改列为Fixed
典型代码:

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列取值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述