.NET Core 2.2下EF Core 2.2.6查询无WHERE子句及插入主键报错问题
问题根因分析
你遇到的两个问题都是Entity Framework Core 2.2版本的典型特性导致的:
- 查询不生成WHERE子句:EF Core 2.2默认开启客户端评估逻辑,当Linq查询中出现无法转换为SQL的语法时,会自动将全表数据拉取到内存中再执行过滤。你代码中使用的
StringComparison.OrdinalIgnoreCase重载的Equals方法,在EF Core 2.2中不支持SQL转换,所以触发了客户端评估,最终生成的SQL没有WHERE条件。 - 插入时报IDENTITY_INSERT错误:byte类型的主键在EF Core 2.2中不会被默认识别为自增列,你只配置了
HasKey但没有显式指定主键值生成策略,EF会默认认为你需要主动给主键赋值,插入时会把CountryId的默认值0传入SQL,和数据库的自增主键配置冲突,触发报错。
解决方案
修复查询无WHERE条件问题
两种可选方案:
- 去掉
StringComparison参数,直接使用==比较:
var country = await _taxContext.Countries .FirstOrDefaultAsync(a => a.TwoLetterISOCode == country.jurisCode) .ConfigureAwait(false);
SQL Server默认排序规则为不区分大小写,该写法可以直接满足匹配需求,且支持转换为带WHERE子句的SQL。
2. 若需要强制大小写不敏感逻辑,改用大小写转换后比较:
var country = await _taxContext.Countries .FirstOrDefaultAsync(a => a.TwoLetterISOCode.ToLower() == country.jurisCode.ToLower()) .ConfigureAwait(false);
该写法会被转换为SQL的LOWER函数,可正常生成WHERE条件。
修复插入主键报错问题
在CountryConfiguration的Configure方法中,给CountryId添加值生成策略配置即可:
builder.Property(ci => ci.CountryId) .ValueGeneratedOnAdd();
显式告知EF Core该主键由数据库生成,插入时不会主动传值,即可解决IDENTITY_INSERT报错。
额外优化建议
EF Core 3.0及以上版本已经默认关闭了客户端评估,遇到无法转换为SQL的语法会直接抛出异常,不会默默执行全表查询导致性能问题,如果项目有升级条件可以考虑升级到更高LTS版本的EF Core,避免同类隐性问题。
内容的提问来源于stack exchange,提问作者TugboatCaptain
相关产品推荐
相关产品推荐

