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

本文共 1803 字,大约阅读时间需要 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是因为使用了一种异常反模式:“把异常作为正常的逻辑处理流程”。

备注

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

 

转载地址:http://cdcyo.baihongyu.com/

你可能感兴趣的文章
github每次推送都要输入用户名和密码
查看>>
DIY 一套正版、免费、强大的 Visual Studio 2012 IDE
查看>>
计算机中的概念: 视图 VS 镜像
查看>>
Restore Volume 操作 - 每天5分钟玩转 OpenStack(60)
查看>>
Kotlin语法(基础)
查看>>
aligned_storage简单学习
查看>>
Swift泛型
查看>>
觉未知
查看>>
Servlet,过滤器,监听器,拦截器的区别
查看>>
CentOS 7更新时出现Multilib version problems
查看>>
python3 的 round 函数的 练习
查看>>
Codeigniter文件上传类型不匹配错误
查看>>
理解 CSS 布局和块级格式上下文
查看>>
MySQL RR隔离级别的更新冲突策略
查看>>
EF 通用数据层类
查看>>
Oracle 12cR1 RAC 在VMware Workstation上安装(中)—图形界面安装
查看>>
Super关键字
查看>>
【云和恩墨】一次 truncate 核心表衍生的安全管理思考
查看>>
REACT day 1
查看>>
ZooKeeper学习笔记1-----------安装启动
查看>>