EF Core操作Oracle时配置序列自动生成插入ID不生效的问题求助
EF Core操作Oracle时配置序列自动生成插入ID不生效的问题求助
大家好,我现在用EF Core操作Oracle数据库时遇到了插入ID的棘手问题,折腾了好一阵没搞定,想请教下各位大佬。
先把相关代码和配置贴出来,方便大家排查:
实体类定义
public partial class Foo { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public decimal Id { get; set; } public decimal? Prop1 { get; set; } public decimal? Prop2 { get; set; } public string? Prop3 { get; set; } public string? Prop4 { get; set; } public virtual ICollection<NavProp> NavProps { get; set; } = new List<NavProp>(); }
ModelBuilder配置
modelBuilder.Entity<Foo>(entity => { entity.HasKey(e => e.Id).HasName("FOO_PK"); entity.ToTable("FOO"); entity.Property(e => e.Id) .HasColumnType("NUMBER") .HasColumnName("ID") .HasDefaultValueSql("SELECT schema.FOO_SEQ.nextval FROM dual "); entity.Property(e => e.Prop1).HasColumnType("NUMBER").HasColumnName("PROP1"); entity.Property(e => e.Prop2) .HasMaxLength(64) .IsUnicode(false) .HasColumnName("PROP2"); entity.Property(e => e.Prop3).HasColumnType("NUMBER").HasColumnName("PROP3"); entity.Property(e => e.Prop4) .HasMaxLength(50) .IsUnicode(false) .HasColumnName("PROP4"); }); modelBuilder.HasSequence("FOO_SEQ");
插入逻辑代码
Foo foo = new() { Prop1 = 1, Prop2 = 1, Prop3 = "test", Prop4 = "test", }; _dbContext.Foo.Add(foo); await _dbContext.SaveChangesAsync().ConfigureAwait(true);
遇到的核心问题
执行插入时,EF Core会往ID列插入NULL,直接触发数据库报错。我配置的HasDefaultValueSql好像完全没生效,这段取序列下一个值的SQL并没有被带入到PL/SQL插入命令里。
我已经试过的方案
- 给实体Id属性加了
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性 - 把
HasDefaultValueSql里的内容简化成schema.FOO_SEQ.nextval(去掉SELECT和dual的写法),还是不行 - 尝试用
HasDefaultValue替代HasDefaultValueSql,问题依旧 - 因为项目同时维护Oracle和Postgres的DbContext,没法用
UseSequence方法,会出现重载冲突
我现在不想用手动执行SQL的方式处理(后续有大量带导航属性的实体要操作,手动写太繁琐),想按照EF Core文档的标准配置让序列自动生成ID。目前我找到了一个临时的workaround,但还是希望能找到符合官方配置方式的正确解法,请问各位有没有遇到过类似问题,或者能看出我哪里配置错了吗?




