ASP.NET Boilerplate中ObjectMapper.Map为何将实体更新变为删除?
排查ASP.NET Boilerplate v3.5中Update方法误执行删除的问题
咱先从最容易踩坑的细节入手排查——毕竟其他服务同款逻辑都正常,说明问题肯定出在这个特定服务的某个小细节里:
先检查Update方法的核心实现
你是不是复制粘贴代码时手滑了?比如把_repository.Update(entity)写成了_repository.Delete(entity)?或者在更新逻辑里不小心调用了DeleteAsync这类删除方法?这种低级失误有时候真的容易被忽略,先对着代码仔细扫一遍。验证实体的软删除相关配置
如果你的实体继承了ISoftDelete接口,得重点检查这两点:- 你的Update DTO里有没有
IsDeleted字段?要是前端传递时误把这个值设成了true,ABP的AutoMapper默认会把这个值映射到实体上,直接触发软删除,看起来就像执行了删除操作。 - 有没有在AutoMapper配置里,错误地把某个无关字段映射到了实体的
IsDeleted属性?比如手滑写错了映射规则。
- 你的Update DTO里有没有
确认参数传递与实体查询是否正确
调用Update时传递的Id是不是正确的?有没有可能传错了Id,导致查询到的不是你要更新的实体,反而误删了其他数据?比如写查询条件时用错了属性:// 错误示例:用错了查询条件,找错了实体 var entity = await _repository.FirstOrDefaultAsync(x => x.WrongField == input.WrongValue); await _repository.DeleteAsync(entity); // 误删了无关实体查看数据库上下文的实体状态
在Update方法里加几行代码,输出实体的状态变化,看看是不是在映射后被标记成了Deleted:var entity = await _repository.GetAsync(input.Id); // 输出初始状态 Console.WriteLine(_dbContext.Entry(entity).State); // 执行DTO到实体的映射 ObjectMapper.Map(input, entity); // 输出映射后的状态 Console.WriteLine(_dbContext.Entry(entity).State); await _repository.UpdateAsync(entity);如果映射后状态变成了
Deleted,那问题肯定出在映射规则或者DTO字段上。排查权限与拦截器配置
虽然其他服务正常,但还是确认下这个特定服务的Update权限是否正确配置——有没有可能用户没有Update权限,却被错误赋予了Delete权限?不过这种情况一般会抛出权限异常,而不是直接执行删除,但也可以快速排查下。
要是能把这个特定服务的Update方法代码贴出来,就能更精准地定位问题了,毕竟相同逻辑在其他服务正常,差异点肯定藏在这个服务的代码或配置里。
内容的提问来源于stack exchange,提问作者Drewskis
相关产品推荐
相关产品推荐

