You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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插入命令里。

我已经试过的方案

  1. 给实体Id属性加了[DatabaseGenerated(DatabaseGeneratedOption.Identity)]特性
  2. HasDefaultValueSql里的内容简化成schema.FOO_SEQ.nextval(去掉SELECT和dual的写法),还是不行
  3. 尝试用HasDefaultValue替代HasDefaultValueSql,问题依旧
  4. 因为项目同时维护Oracle和Postgres的DbContext,没法用UseSequence方法,会出现重载冲突

我现在不想用手动执行SQL的方式处理(后续有大量带导航属性的实体要操作,手动写太繁琐),想按照EF Core文档的标准配置让序列自动生成ID。目前我找到了一个临时的workaround,但还是希望能找到符合官方配置方式的正确解法,请问各位有没有遇到过类似问题,或者能看出我哪里配置错了吗?

火山引擎 最新活动