在 EF Core/自动生成 ID 中保存实体时将 IT 留空

Posted

技术标签:

【中文标题】在 EF Core/自动生成 ID 中保存实体时将 IT 留空【英文标题】:Leave ID blank when saving entry in EFCore / Auto generate ID 【发布时间】:2022-01-05 19:06:14 【问题描述】:

我想根据模型在我的数据库中创建一个新条目。

当我将我的 dto 自动映射到数据库的实际模型时,id 属性变为:0。 数据库中已经有一个 id 为 0 的条目。如何忽略 id 值并为数据库自动生成 id?

public async Task<WikiDetailDto> AddWiki(WikiDetailDto wikiDetailDto)
        
            WikiPage newPage;
            newPage = mapper.Map<WikiPage>(wikiDetailDto);
            newPage.CategoryId = wikiDetailDto.Category.Id;
            await _context.AddAsync(newPage);
            await _context.SaveChangesAsync();
            return wikiDetailDto;
        

【问题讨论】:

【参考方案1】:

嗯,首先你需要在数据库模型中用属性或流式模型配置注释Id属性。

modelBuilder.Entity<TEntity>()
        .HasKey(entity => entity.Id);

[Key]
public int Id  get; set; 

据我记得,EF 可以通过IdSmthId 等模式自动识别属性,但不确定。 然后你只需将 0 作为 Id 属性的值传递(默认情况下 int 等于 0),在调用 DbContext.SaveChanges() 后,将生成属性 Id 并保存到属性中。

【讨论】:

Id 被视为没有注释的主键,但是当 id = 0 时,我会收到错误,因为 0 已经存在于数据库中,当我手动将其设置为 1000 时,它会保存。 您是否从头开始使用代码优先方法?我的意思是,您有迁移并通过迁移应用所有模型更改? 这是一个数据库优先项目。我通过 PMC 自动生成了模型和 DBContext

以上是关于在 EF Core/自动生成 ID 中保存实体时将 IT 留空的主要内容,如果未能解决你的问题,请参考以下文章

为啥 EF Core 5 不使用我的实体“地址”的“Id”属性上的“[Key]”属性创建“主键自动增量”?

EF Core中怎么实现自动更新实体的属性值到数据库

EF Core - 无法添加具有相同相关对象的实体

EF Core 5检查过滤器中的所有ID是不是存在于相关实体中

将类别父 ID 自引用表结构映射到 EF Core 实体

EF Core 5.0 - 更改“定义查询”映射实体时是不是需要生成迁移?