【问题标题】:AutoMapper overwriting nested field with nullAutoMapper 用 null 覆盖嵌套字段
【发布时间】:2018-05-02 23:16:13
【问题描述】:

我有以下代码应该:

  1. 将实体转换为 dto
  2. 更新 dto 中的属性
  3. 将 d 转换回实体
  4. 使用更新的属性更新原始实体

这几乎可以工作,但在最终更新期间 - 其中一个字段被设置为 null,但不应触摸它。

主要:

Entity e = new Entity("Id")
{
    Additional = new EntityAdditional()
    {
        Editable = "Change Me!",
        NotEditable = "Don't Change Me!"
    }
};

Dto dto = Mapper.Map<Dto>(e);

dto.Additional.Editable = "Changed!";

Mapper.Map<Dto, Entity>(dto, e); // e NotEditable is null!

映射:

config.CreateMap<Entity, Dto>()
    .ForMember(d => d.Additional,
    input => input.MapFrom(i => new DtoAdditional{
        Editable = i.Additional.Editable
    }));

config.CreateMap<Dto, Entity>()
    .ForMember(d => d.Additional,
    input => input.MapFrom(i => new EntityAdditional
    {
        Editable = i.Additional.Editable
    }));

实体:

public class Entity
{
    public string Id { get; set; }
    public EntityAdditional Additional { get; set; }

    public Entity(string id) {
        Id = id;
        Additional = new EntityAdditional()
        {
            Editable = "Editable",
            NotEditable = "UnEditable"
        };
    }
}

public class EntityAdditional
{
    public string Editable { get; set; }
    public string NotEditable { get; set; }
}

Dto:

public class Dto
{
    public DtoAdditional Additional { get; set; }
}

public class DtoAdditional
{
    public string Editable { get; set; }
}

【问题讨论】:

    标签: c# .net automapper


    【解决方案1】:

    那是因为你指定了:

    new EntityAdditional
    {
        Editable = i.Additional.Editable
    //, NotEditable = null // Default value
    }));
    

    无需自定义映射:

    Mapper.CreateMap<EntityAdditional, DtoAdditional>()
        .ReverseMap();
    
    Mapper.CreateMap<Entity, Dto>()
        .ReverseMap();
    

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2021-10-13
      • 1970-01-01
      • 2017-03-28
      • 2017-05-26
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多