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

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字段已经配置为插入时自动生成值:
    1. 注解方式配置:
    public class WikiPage
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 插入时由数据库自动生成值
        public int Id { get; set; }
        // 其余字段省略
    }
    
    1. Fluent API 配置(在DbContext的OnModelCreating方法中添加):
    modelBuilder.Entity<WikiPage>()
        .Property(p => p.Id)
        .ValueGeneratedOnAdd();
    

注意:如果数据库表的ID列本身未设置为自增主键,需要先修改表结构,将ID列设为自增,上述配置才能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:24:06