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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:37:19