Dev Guide: js | css | HTML(DOM) WEBCAST .NET4 Lib Web.config-WCF MVC3-EF4.1 T-SQL-(2012)

浅谈EF 4 CodeFirst的调试技巧及注意要点

I:写本篇博客文章的起因

本小虾昨天按照项目进度安排在做一个项目模块,里面有一个功能就是将客户录入好的Excel文件(Excel2003/2007)通过后台管理网站上传并导入至MSSQL数据库内的表里。

心想这个小case应该难度不大。博主便选择了NPOI 2.0.1(beta1)加EF 4.1去开发。结果碰到一个很莫名其妙的错误。所以才有幸写下这篇博客文章!记录一下以免各位遇到相同情况的时候可以注意一下。

II:EF 4 CodeFirst调试基础知识

不管是EF还是LINQ2SQL还是其他ORM,他们底层基本上都是使用ADO.NET的原生类库去操作读写数据库的。作为开发人员我们迫切需要有一个工具可以监视得到ORM提交给MSSQL的T-SQL脚本命令以方便进行排bug,在此本人推荐各位使用MSSQL自带的SQL Server Profiler。它的打开方式如下:

image

切记Express版本的SQL Server是没有集成这个工具的。

跟踪一个数据库的当前正在执行的脚本信息
打开SQL Server Profiler,点击[文件] –> [新建跟踪] 登陆到数据库服务后跳转到如下图示:
image
注意勾选[显示所有列]的复选框,紧接着单击[列筛选器]按钮。在弹出的对话框当中设置需要监视的DatabaseID(不知道自己数据库是那个Id的可以执行[select * from sys.databases]查看)image
输入好数据库ID过滤筛选条件后点击[确定],然后再点击[运行]按钮,最终效果图如下图示:
image
添加数据库ID筛选条件的作用在此我简单介绍一下,它可以帮助我们过滤掉一些毫无意义的脚本命令,让我们更加关心跟踪对象本身。

关于SQL Server Profiler的工具栏及菜单我就不一一介绍了。接下来还是进入正题!

III:工作任务当中出现的诡异错误

进行编码工作的调试时发现EF报错,错误的原因尽然是EF 4.1往MSSQL上提交了一条全为空的字符串信息从而导致表的外键约束规则异常:
image
.NET异常图,由于List<T>的数量巨大。所以无法一一定义到底是那一个对象的属性值是"空"。


image
对应上述.NET异常跟踪到的T-SQL显示EF提交的sql既然是由于插入了N''空字符串导致外键约束验证出错。
对此楼主的做法时加入了一个变量它的作用就是将空白的对象打入log内。

var logVal = List.Select(m => string.IsNullOrEmpty(m.Key)).ToList();

  

再进行一轮反复【修改代码 <--> 调试】后,发现出错的原因尽然是Excel文件内最后空出来的几行没有被删掉却被NPOI读出来后当成N''插入到数据库里面去了。所以才会法伤上面插入N’’字符串引发的外键约束报错。

果断对其下症Fixbug:

image

 

最后成功执行导入的截图:
image

IV:结论

请相信机器是根据人的意愿去执行代码的。大多数情况下不会无端端执行出错(比如胡乱插入几行N’’空记录)。

因此,对于经常使用ORM的我们来说学会抓取ORM执行的t-sql已经是一门必备的技能了,另外在程序代码方面也要做好完善的log跟踪输出!

本文到此结束!

posted @ 2013-03-20 18:44  dotNetDR_  阅读(2322)  评论(9编辑  收藏  举报