.Net Core使用EF Core从Excel导入数据到数据库时如何自动生成ID
EF Core Excel导入场景下主键ID自动生成解决方案
核心逻辑是依赖EF Core内置的自增主键支持,无需在Excel中提前录入ID字段,配置完成后导入时自动生成ID值。
1. 配置实体主键自增属性
两种配置方式二选一即可:
数据注解方式
直接在实体类的ID字段上加特性:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; public class 你的实体类名 { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // 其余和Excel字段映射的属性,例如: public string 字段1 { get; set; } public int 字段2 { get; set; } }
Fluent API方式
在DbContext的OnModelCreating方法中配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类名>() .HasKey(e => e.Id); modelBuilder.Entity<你的实体类名>() .Property(e => e.Id) .ValueGeneratedOnAdd(); }
2. 调整导入逻辑
映射Excel行数据到实体对象时,完全不需要给Id属性赋值,直接将实体添加到DbContext即可,示例逻辑:
// 循环读取Excel每一行 foreach (var excelRow in 读取到的Excel行集合) { var 实体对象 = new 你的实体类名 { // 仅赋值Excel中存在的对应字段,Id完全不用处理 字段1 = excelRow.对应列值, 字段2 = excelRow.对应列值, // 其余字段依次赋值 }; // 加入上下文集合 dbContext.你的实体集合名.Add(实体对象); } // 批量保存 dbContext.SaveChanges(); // 保存完成后,每个实体对象的Id属性会自动填充数据库生成的自增值
3. 数据库端校验(仅DB First场景需要)
如果是先建数据库表再生成实体的场景,需要确认表中的ID字段已经开启自增属性:
- SQL Server:确认ID字段的「标识规范」设置为「是」,标识增量和种子默认设为1即可
- MySQL:确认ID字段设置为
AUTO_INCREMENT - PostgreSQL:确认ID字段类型为
SERIAL或IDENTITY
注意事项
- 除非有特殊自定义需求,不要手动给Id属性赋值,EF Core会自动忽略手动赋值,优先使用数据库生成的自增值
- 批量导入时建议批量添加所有实体后统一调用
SaveChanges,比每行保存的效率高很多 - 如果导入后需要用生成的ID做后续业务处理,
SaveChanges后直接取实体的Id属性即可,无需额外查询数据库
内容的提问来源于stack exchange,提问作者Sin Lee
相关产品推荐
相关产品推荐

