ef core 中不能使用 jpa 的 @sequencegenerator 注解,必须通过 hasdefaultvaluesql 或 hascomputedcolumnsql 显式配置序列函数;手动赋值主键会绕过序列导致冲突。

EF Core 里不能用 @SequenceGenerator,那是 JPA 的注解,直接粘贴会编译失败或完全不生效。 正确做法是靠模型配置 + 数据库函数驱动,不是靠注解标记。
EF Core 配置序列必须用 HasDefaultValueSql 或 HasComputedColumnSql
Oracle 没有 IDENTITY 列,[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 在 Oracle 上会导致插入失败或主键为 0/NULL。EF Core 主键生成必须显式绑定到序列函数:
- Oracle 12c 及以上:用
HasDefaultValueSql("MY_SEQ.NEXTVAL"),生成的 INSERT 语句不包含主键字段,由数据库自动填充 - Oracle 11g 或旧版驱动:改用
HasComputedColumnSql("MY_SEQ.NEXTVAL"),注意这会让字段变成只读计算列,不能手动赋值 - 必须在
OnModelCreating中为每个使用序列的实体属性单独配置,例如:entity.Property(e => e.Id).HasDefaultValueSql("ORDER_SEQ.NEXTVAL") - 如果手动给
Id赋了值(比如new Order { Id = 100 }),EF Core 会把它当普通字段塞进 INSERT,覆盖序列值——这是常见静默错误
MyBatis 里 @SequenceGenerator 只是标记,真正干活的是 @SelectKey
@SequenceGenerator 在 MyBatis 中不触发任何行为,纯属元数据标记。主键取值必须靠 @SelectKey 或 XML 中的 <selectkey></selectkey> 标签:
-
@SelectKey必须加在@Insert方法上,且before = true、resultType = long.class - SQL 必须写成
SELECT MY_SEQ.NEXTVAL FROM DUAL,漏掉FROM DUAL在 Oracle 里直接报错 - 如果误配了
useGeneratedKeys = true,MyBatis 会跳过序列,尝试用 RETURNING 子句——但旧版 Oracle JDBC 驱动不支持,结果是主键为 null 且无报错 -
keyProperty值必须与实体字段名严格一致(大小写敏感),否则取到的值不会写入对象
序列权限和驱动版本不匹配是运行时报错的高频原因
ORA-00942 或 InvalidOperationException 往往不是代码写错,而是环境没对齐:
- 确保当前数据库用户对序列有
SELECT权限,否则运行时抛ORA-00942: table or view does not exist - Oracle.EntityFrameworkCore 版本必须匹配数据库版本:Oracle 12c → 用 5.22.150 或 6.21.120;19c/21c → 可用 7.23.19+,但 EF Core 8 脚手架需加
--framework net8.0 - 连接字符串必须显式含
User ID=和Password=,不能省略;密码含@或;时要用单引号包裹,如Password='p@ss;word' - 脚手架生成模型后,检查
DbContext构造或OnConfiguring是否已调用UseOracle—— 漏掉这步会导致HasDefaultValueSql配置被忽略
最易被忽略的点:序列值生成发生在数据库侧,EF Core 不感知也不干预;一旦你在 C# 层手动设了主键值,就等于主动绕过了序列逻辑——这个行为在调试时很难察觉,但上线后会导致主键冲突或跳号。











