尽管有条件,AutoMapper也不会忽略null属性

时间:2016-08-24 15:33:29

标签: c# automapper

Mapper.Initialize(cfg =>
{
    cfg.CreateMap<ObjectDTO, Object>().ForMember(obj => obj.LastUpdateDate, opt => 
        opt.Condition(pre =>   pre.LastUpdateDate != null));
}

obj.LastUpdateDate = Datetime.Now;
Mapper.map(objDTO,obj);

在映射之后,尽管我创建了条件,obj.LastUpdateDate仍将变为空。

对象的所有成员都会发生。

Automapper 5.02

2 个答案:

答案 0 :(得分:3)

你是否积极LastUpdateDatenullDatetime有一个默认值,因此,如果您没有明确说明将其设置为null,那么您的情况将无法捕捉到它。

尝试:

cfg.CreateMap<ObjectDTO, Object>()
       .ForMember(dest => dest.LastUpdateDate, opt => opt.Condition(c => c.LastUpdateDate != null && c.LastUpdateDate != default(DateTime)));

编辑:

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<ObjectDTO, Object>()
                .ForMember(dest => dest.Number, opt => opt.Condition(src => src.Number.HasValue))
                .ForMember(dest => dest.LastUpdateDate, opt => opt.Condition(src => src.LastUpdateDate.HasValue));

        });

        Mapper.AssertConfigurationIsValid();

        var source = new ObjectDTO { LastUpdateDate = DateTime.Now };
        var destination = new Object { Number = 10, LastUpdateDate = DateTime.Now.AddDays(-10) };
        var result = Mapper.Map(source, destination);
    }
}

public class ObjectDTO
{
    public int? Number { get; set; }
    public DateTime? LastUpdateDate { get; set; }

}

public class Object
{
    public int? Number { get; set; }
    public DateTime? LastUpdateDate { get; set; }
}

答案 1 :(得分:0)

条件位于 source 对象上,而不是目标。

因此,您可以更好地命名变量:

.ForMember(dest => dest.LastUpdateDate, opt => opt.Condition(src => src.LastUpdateDate != null));

那么,你的objDTO中有什么?