EFCore配合AutoMapper保存新数据时如何实现ID自动生成
解决方案
你可以通过以下几种方式解决该问题,按需选择即可:
- 方案1:配置AutoMapper映射时忽略ID字段(推荐)
在你的AutoMapper Profile配置类中,为WikiDetailDto到WikiPage的映射规则添加ID字段忽略配置,映射时就不会把DTO中携带的ID值赋值给实体:
// AutoMapper Profile 配置示例 CreateMap<WikiDetailDto, WikiPage>() // 忽略ID字段的映射 .ForMember(dest => dest.Id, opt => opt.Ignore());
- 方案2:映射完成后手动重置实体ID
如果不想修改全局映射规则,直接在现有业务代码中新增一行重置ID的逻辑即可,改动最小:
public async Task<WikiDetailDto> AddWiki(WikiDetailDto wikiDetailDto) { WikiPage newPage; newPage = mapper.Map<WikiPage>(wikiDetailDto); newPage.Id = default; // 手动重置ID为类型默认值,EF会触发数据库自动生成逻辑 newPage.CategoryId = wikiDetailDto.Category.Id; await _context.AddAsync(newPage); await _context.SaveChangesAsync(); return wikiDetailDto; }
- 方案3:确认实体ID已配置为数据库自动生成
这是数据库能自动生成ID的前提,需要确保WikiPage实体的ID字段已经配置为插入时自动生成值:- 注解方式配置:
public class WikiPage { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 插入时由数据库自动生成值 public int Id { get; set; } // 其余字段省略 }- Fluent API 配置(在DbContext的OnModelCreating方法中添加):
modelBuilder.Entity<WikiPage>() .Property(p => p.Id) .ValueGeneratedOnAdd();
注意:如果数据库表的ID列本身未设置为自增主键,需要先修改表结构,将ID列设为自增,上述配置才能生效。
内容的提问来源于stack exchange,提问作者Joben
相关产品推荐
相关产品推荐

