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

如何在EF中实现强类型Int ID的自动递增功能?

实现EF Core中强类型FileUploadId的默认int自增

当然可行!你之前的配置差了关键一步——虽然用了ValueGeneratedOnAdd()告诉EF这个值在添加时生成,但没明确指定数据库层面的自增策略。下面是修正后的完整配置和解释:

修正后的TypeConfiguration代码

public class FileUploadTypeConfig : IEntityTypeConfiguration<FileUpload>
{
    public void Configure(EntityTypeBuilder<FileUpload> builder)
    {
        builder.HasKey(x => x.Id);
        
        builder.Property(x => x.Id)
            .HasConversion(id => id.Value, value => new FileUploadId(value))
            .ValueGeneratedOnAdd()
            .UseIdentityColumn(); // 这行是关键!
        
        // 其他属性配置...
    }
}

为什么之前没生效?

ValueGeneratedOnAdd()只是告诉EF「这个属性的值在插入实体时会由数据库生成」,但它不会自动让数据库把对应的列设置为自增类型。而UseIdentityColumn()会明确指示EF在创建表时,将该列配置为数据库的自增列(比如SQL Server的IDENTITY(1,1)、MySQL的AUTO_INCREMENT、SQLite的自增主键)。

额外注意事项

  • 你在FileUpload构造函数里设置Id = new FileUploadId(0);是完全没问题的,EF在插入时会自动用数据库生成的自增值覆盖这个初始值。
  • 确保你的FileUploadId是不可变的(你已经做到了:Value是get-only,类是sealed),这是值对象作为主键的最佳实践。
  • 如果是已存在的数据库,记得通过EF迁移更新表结构,或者手动修改对应列的自增属性。

你可以生成迁移文件验证一下,对应的SQL语句里应该会出现自增列的配置标记,比如SQL Server下会带有IDENTITY关键字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:59