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

