AutoMapper用null覆盖嵌套字段

时间:2018-05-02 23:16:13

标签: c# .net automapper

我有以下代码应该:

  1. 将实体转换为dto
  2. 在dto中更新属性
  3. 将dto转换回实体
  4. 使用更新的属性更新原始实体
  5. 这几乎可以工作,但在最后更新期间 - 其中一个字段被设置为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; }
    }
    

    实体:

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

    DTO:

    string DefaultConnection =_iconfiguration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
    

1 个答案:

答案 0 :(得分:1)

那是因为你指定了:

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

无需自定义映射:

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

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