Visual Studio 2017输出窗口Entity Framework异常排查咨询
嘿,我之前也踩过这个EF异常的坑,别着急,咱们一步步来精准定位问题:
第一步:开启异常捕获,让程序直接停在抛出点
光看输出窗口的提示没用,得让VS在异常抛出时立刻中断。操作很简单:
点击顶部菜单栏的Debug->Windows->Exception Settings(或者直接按快捷键Ctrl+Alt+E)。在弹出的窗口里,找到Common Language Runtime Exceptions展开,定位到System.Data.Entity.Core.EntityCommandExecutionException,把它前面的复选框勾上。之后重新运行程序,VS就会直接停在异常抛出的那一行代码,而不是只在输出窗口发个通知。第二步:深挖异常的真实原因——看Inner Exception
当程序中断后,打开Exception Details窗口(Debug->Windows->Exception Details)。这里除了显示当前的EntityCommandExecutionException,一定要重点看Inner Exception!绝大多数情况下,这个内部异常才是问题的根源——比如可能是SqlException,里面会明确告诉你是SQL语法错了、数据库连接失败、权限不够,甚至是某个列名写错了。第三步:通过调用栈找到你的代码问题点
打开Call Stack窗口(Debug->Windows->Call Stack),这里会显示异常的调用路径。从栈顶往下找,找到属于你自己项目的代码行(不是EF框架的代码),双击就能直接跳转到对应的代码位置,看看是不是你的LINQ查询、实体操作哪里写得不对。第四步:如果是SQL相关问题,输出EF生成的SQL排查
要是怀疑是EF生成的SQL有问题,可以给DbContext加个日志,把生成的SQL打出来。在你的DbContext构造函数里加这段代码:public YourDbContext() : base("YourConnectionString") { this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); }重新运行程序后,输出窗口会显示EF执行的所有SQL语句,把这段SQL复制到SQL Server Management Studio里执行,就能快速定位是不是SQL本身的问题。
内容的提问来源于stack exchange,提问作者user3369534

