EF Core数据插入表失败的2种解决方案

我们头最近引入了一个第三方开源的框架,框架可以针对指定自动生成实体、接口、增删改查类等,但对于新增库的话需要再次手动编写新的实体、类、接口以及依赖注入,如果少了某个环节或者实体某个字段有问题,解决很浪费时间,极为不方便。小编前段时间就遇到过新增数据失败的问题,需求是传入数据需要更新到多个表里,方法很快就完成了,测试的时候发现插入失败了,经过调试发现只有一张表插入失败,其他表等正常,这就很郁闷了。但是最后发现不是框架的问题,是表约束的问题。.

执行代码报错:

An error occurred while updating the entries. See the inner exception for details.

解决方法

    解决方法有两种,一种是可以查看报错的日志,还有可以用SQL Server Profiler这个工具查看实际执行的语句,这里给大家总结一下经验。 

1、查看输出日志。

日志有系统日志和自定义日志,在输出中可以查看到执行的系统日志,如下图。

EF Core数据插入表失败的2种解决方案

在输出中找到报错的内容,然后继续往下找,从结果可以看出,此次是SaveChangesAsync 引发异常,再往下找可以看到"

Microsoft.Data.SqlClient.SqlException (0x80131904): 不能将值 NULL 插入列 'IsDefaults',表 'tableName';列不允许有 Null 值。INSERT 失败。" 。这就很明显了,是'IsDefaults'字段不能为Null的问题,加上这个字段后恢复正常。当然如果查输出有难度,可以自定义错误日志,在日志里面也可以捕捉到有效信息。

2、查看实际执行的SQL语句。

    实际执行的SQL语句可以用EF Core的内置方法和SQL Server Profiler(仅支持SQL Server)工具查看,这里介绍如果使用SQL Server Profiler查看执行语句。

首先打开SQL Server 点击工具菜单,选择SQL Server Profiler打开,也可以直接在windows系统开始菜单搜索到,如下图

EF Core数据插入表失败的2种解决方案

打开界面如下

EF Core数据插入表失败的2种解决方案

运行后便可以查看正在执行的SQL语句。这里可以先不运行,因为工具是抓取所有的执行语句,我们可以在程序运行前再执行运行,这样就不用在多条数据里寻找。运行后也可以在编辑里清除跟踪窗口。

EF Core数据插入表失败的2种解决方案

运行后在跟踪窗口找exec sp_executesql开头的语句,然后在下面查看是否包含当前错误的表,如下图,然后复制语句在SQL Server运行。

EF Core数据插入表失败的2种解决方案

这里执行结果跟日志报错的字段相同,针对性的给该字段赋值后问题完美解决。

EF Core数据插入表失败的2种解决方案

从根本解决这个问题可以在实体中设置默认值。例如下:

public int Delete { get; set; } = 0;

后记

    从错误的情况来看,还是实体字段的问题,其实原生EF也会出现这个问题,跟实际的架构没有关系,找问题还是得从根源找,不能只看表象。写这篇文章也是供大家参考,遇到类似问题可以举一反三。当然不能吐槽任何架构,选择适合项目的架构是最重要的。水平有限,大家有什么看法,欢迎留言讨论。