You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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条件问题

两种可选方案:

  1. 去掉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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:45:10