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
相关产品推荐
相关产品推荐

