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

EF Core中非主键Guid字段自动生成配置问题

非主键Guid字段自动生成的正确配置方法

问题原因

你之前的配置仅定义了数据库端的默认值规则,但未告知EF Core该属性的值需要由数据库在插入时生成,所以EF Core会将Guid类型的默认值Guid.Empty作为插入值提交到数据库,不会触发数据库的默认值约束。

正确配置(SQL Server 环境)

Fluent API 配置方式

在你的实体配置代码中补充ValueGeneratedOnAdd配置即可:

builder.Property(x => x.Identifier)
    .HasDefaultValueSql("NEWSEQUENTIALID()")
    .ValueGeneratedOnAdd();

数据注解配置方式

如果你不想用Fluent API,也可以直接在实体属性上加注解:

public class Test
{
    public int Id { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Identifier { get; set; }
}

同时需要在上下文的OnModelCreating方法里配置默认值SQL,或者直接在迁移文件中给字段添加默认值约束。

注意事项

  • 执行迁移后请检查生成的迁移代码,确认Identifier字段的defaultValueSql参数值为"(newsequentialid())",配置错误的话可以手动修改迁移文件后再更新数据库。
  • 插入实体时不要手动给Identifier赋值,保持默认的Guid.Empty即可,插入完成后EF Core会自动将数据库生成的Guid值回写到实体对象中。
  • 如果你使用的不是SQL Server数据库,需要替换为对应数据库的Guid生成函数:比如MySQL用UUID(),PostgreSQL用uuid_generate_v4()。

替代方案:应用层生成Guid

如果你不想依赖数据库的默认值约束,可以直接在实体的构造函数中赋值,不需要额外配置EF Core规则:

public class Test
{
    public Test()
    {
        Identifier = Guid.NewGuid();
    }
    public int Id { get; set; }
    public Guid Identifier { get; set; }
}

这种方式的优势是跨数据库兼容,劣势是生成的Guid是无序的,作为索引字段时插入性能比NEWSEQUENTIALID()生成的有序Guid差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:24:03