使用Entity Framework开发.NET Core API时无ID值如何更新表数据
可行实现方案
方案1:新增对外非敏感唯一标识(最推荐)
在数据库实体中额外增加一个与主键一一对应的对外唯一字段,类型推荐使用Guid,插入数据时自动生成,仅对外暴露该字段,永远不返回数据库主键ID。
- 实体定义示例:
public class Person { // 数据库自增主键,全程不对外暴露 public int Id { get; set; } // 对外唯一标识,和主键一一绑定 public Guid PublicId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
- 对外返回DTO定义:
public class PersonDto { public Guid PublicId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } }
执行更新、删除操作时,前端传递PublicId,后端通过该字段查询到对应实体后执行操作即可,既避免了暴露数据库主键带来的遍历爬取风险,也能保证操作的精准性。
方案2:使用业务唯一组合键
如果你的业务场景中存在全局唯一的字段组合,例如FirstName+LastName不会出现重复,就可以直接用该组合作为查询条件查找实体,无需额外新增字段。
- 更新操作示例代码:
public async Task UpdatePersonAsync(PersonUpdateDto updateDto, CancellationToken cancellationToken) { var targetPerson = await _context.Persons .FirstOrDefaultAsync(p => p.FirstName == updateDto.FirstName && p.LastName == updateDto.LastName, cancellationToken); if (targetPerson == null) { throw new KeyNotFoundException("未找到匹配的人员数据"); } targetPerson.Age = updateDto.Age; await _context.SaveChangesAsync(cancellationToken); }
注意:该方案仅适用于业务字段组合确实全局唯一的场景,若存在重复数据会导致误操作,不建议通用场景使用
方案3:加密主键后对外返回
如果不想改动数据库表结构,可以将数据库主键进行对称加密后放到DTO中返回,前端执行操作时传回加密字符串,后端解密得到真实主键后执行操作即可,加密密钥仅保存在后端配置中,不会泄露原始主键信息。
内容的提问来源于stack exchange,提问作者pachyderm94
相关产品推荐
相关产品推荐

