博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
阅读量:4594 次
发布时间:2019-06-09

本文共 1861 字,大约阅读时间需要 6 分钟。

背景

之前写过两篇文章介绍模型的合法性:

今天讨论的问题其实是关于“”的,只是其中还涉及一种决策:“允许模型处于非常状态”。

测试代码

1         public static void Do() 2         { 3             Database.SetInitializer
(new DropCreateDatabaseAlways
()); 4 5 using (var context = new MyDbContext()) 6 { 7 /****************添加一个Note*****************/ 8 var note = new Note { Name = "合法名字" }; 9 context.Set
().Add(note);10 context.SaveChanges();11 /****************添加一个Note*****************/12 13 try14 {15 /****************让Note处于非法状态*****************/16 var firstNote = context.Set
().First();17 firstNote.Name = "非法名称";18 if (firstNote.Name == "非法名称")19 {20 throw new InvalidOperationException("非法名称");21 }22 /****************让Note处于非法状态*****************/23 }24 catch25 {26 //这里会出现BUG,显示的还是非法名字。27 Console.WriteLine(context.Set
().First().Name);28 29 //清空DbContext以后就对了。30 foreach (var entity in context.ChangeTracker.Entries())31 {32 entity.State = EntityState.Detached;33 }34 Console.WriteLine(context.Set
().First().Name);35 }36 }37 }

分析

第一个输出之所以不是期望的结果是因为EntityFramework内置了主键映射模式,内存状态还是处于非法状态,虽然First会导致一次数据库往返。

第二个输出之所以正确是因为清空了主键映射,这样会导致重新用数据库的内容填充主键映射。

结论

出现异常最好终止线程或程序的执行,上边这种BUG是因为使用了一种异常反模式:“把异常作为正常的逻辑处理流程”。

备注

这个错误我犯过,后来的朋友也犯过。

 

转载于:https://www.cnblogs.com/happyframework/p/3200360.html

你可能感兴趣的文章
避免创建不必要的对象减少.NET应用程序内存占用
查看>>
Ubuntu忘记管理员密码
查看>>
Getting started with Processing 第十一章——数组
查看>>
计算几何-凸包算法 Python实现与Matlab动画演示
查看>>
thinkphp模版主题使用方法
查看>>
中国大陆开源镜像站汇总
查看>>
linux date命令
查看>>
程序执行流程/布尔类型与布尔:运算猜数字游戏;库的使用:turtle
查看>>
C# 连接Oracle,进行查询,插入操作
查看>>
Linux内核0.11 bootsect文件说明
查看>>
240.Search in a 2D Matrix II
查看>>
react 组件的生命周期
查看>>
[00013]-[2015-08-27]-[01]-[Windows 程序设计 ---GDI+ 截图---> BMP OR JPG OR PNG ...]
查看>>
linux用户
查看>>
空间距离计算
查看>>
180128-----Java面试题
查看>>
java①
查看>>
CentOS7静态IP设置
查看>>
java ee开发杂记
查看>>
php小程序支付代码(微信公众平台,完整版)
查看>>