Mapster能否在实体变更时自动更新对应的DTO?
问题与解决方案
环境信息
- Mapster 7.3.0
- EF Core 7.0.5
- ASP.NET Core 7.0.0
实体类
public class Setting { [Key] public Guid Id {get;set;} public string Name {get;set;} public string Value {get;set;} }
DTO类
public class SettingDto { public Guid Id {get;set;} [Required] public string Name {get;set;} [Required] public string Value {get;set;} }
代码示例
var dtoToAdd = new SettingDto { Name = "setting1", Value = "value1" }; var entity = dtoToAdd.Adapt<Setting>(); //修改设置名称 entity.Name = "entitySetting1"; DbContext.Entity<Setting>().Add(entity); DbContext.SaveChanges(); //断言dtoToAdd会自动更新 Assert.Equal(entity.Name, dtoToAdd.Name); Assert.Equal(entity.Id, dtoToAdd.Id);
问题解答
Mapster默认不会自动将实体的变更同步到DTO,因为Adapt<Setting>()是创建了一个全新的Setting实体实例,DTO和实体是完全独立的对象,两者没有绑定关系。
要实现实体变更后同步到DTO,可以通过手动反向映射实现:在实体完成变更并保存后,调用Mapster的反向适配方法,将实体的最新值覆盖到已有的DTO实例上。修改后的代码如下:
var dtoToAdd = new SettingDto { Name = "setting1", Value = "value1" }; var entity = dtoToAdd.Adapt<Setting>(); //修改设置名称 entity.Name = "entitySetting1"; DbContext.Entity<Setting>().Add(entity); DbContext.SaveChanges(); //手动同步实体最新值到DTO entity.Adapt(dtoToAdd); //断言会通过 Assert.Equal(entity.Name, dtoToAdd.Name); Assert.Equal(entity.Id, dtoToAdd.Id);
针对你提到的“ASP.NET Core控制器仅知晓SettingDto,不知晓Setting实体类”的场景,可以在数据/业务层完成实体操作后,将更新后的实体映射为DTO再返回给控制器,或者在业务逻辑中封装反向映射的逻辑,确保控制器拿到的DTO是最新状态。
内容的提问来源于stack exchange,提问作者coolboy
相关产品推荐
相关产品推荐

