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

EF Core 2.2升级至3.1后DbSet.Add()无法自动生成Guid ID求助

我之前帮朋友排查过类似的EF Core 3.1升级问题,结合你用的dotConnect for Oracle环境,给你几个针对性的解决方案:

问题根源分析

虽然EF Core 3.0的重大变更明确只针对字符串和字节数组键,但第三方数据库提供程序(比如你用的dotConnect for Oracle)在适配EF Core 3.x时,可能调整了Guid类型主键的默认值生成策略——不再自动启用客户端或数据库端的自动生成逻辑,必须显式配置。

具体解决方案

1. 配置数据库端自动生成(Oracle环境推荐)

Oracle自带SYS_GUID()函数生成Guid,你可以通过配置让EF Core调用这个数据库函数来生成主键:

数据注解方式

直接在实体的Id属性上添加注解:

class Patient {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

FluentAPI方式

在DbContext的OnModelCreating方法里配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Patient>()
        .Property(p => p.Id)
        .HasDefaultValueSql("SYS_GUID()") // 指定Oracle用内置函数生成默认值
        .ValueGeneratedOnAdd(); // 标记为添加时自动生成值
}

这种方式下,Id会在SaveChanges()时由数据库生成并回填到实体中。如果想要和EF 2.2一样调用Add()就立即生成Guid,可以用下面的客户端生成方案。

2. 配置客户端自动生成Guid

要完全还原EF 2.2的行为——调用Add()时就生成Guid,可以让EF使用内置的客户端值生成器:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Patient>()
        .Property(p => p.Id)
        .ValueGeneratedOnAdd()
        .HasValueGenerator<GuidValueGenerator>(); // 启用EF内置的客户端Guid生成器
}

配置完成后,执行ctx.Patients.Add(newPatient)时,Id会立即被赋值为新的Guid,和你之前在2.2里的体验完全一致。

3. 检查驱动版本兼容性

你用的是dotConnect for Oracle v9.11,这个版本发布时间较早,可能对EF Core 3.1的适配存在细节问题。建议尝试升级到v10.x及以上的版本,新版本通常会修复EF Core版本适配的bug,默认行为可能会更贴合你的预期。

4. 构造函数手动生成(兜底方案)

如果上面的配置都不生效,最直接的方式是在Patient的构造函数里手动生成Guid:

class Patient {
    public Patient()
    {
        Id = Guid.NewGuid();
    }
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

这种方式不受EF版本或数据库驱动的影响,创建实例时就会自动生成Id,唯一的缺点是生成逻辑硬编码在实体里,灵活性稍差。

内容的提问来源于stack exchange,提问作者realmikep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:57:44