自动映射:处理对象到对象映射的可为空的属性

时间:2017-04-28 11:41:38

标签: c# mapping automapper nullable automapper-5

我正在使用Automapper 6.0.2。我有一个控制台应用程序,下面的代码如下。我试图通过将对象的条件放置到对象映射关系来实现排序或部分更新功能。所以我正在使用:

.ForAllMembers(opt => opt.Condition(
   (source, destination, sourceMember, destMember) => sourceMember != null))

然而,在映射Mapper.Map(newViewModel, newModel)期间,似乎Automapper将可空对象属性重新创建为具有默认值的非可空表单。我希望下面的代码newModel保持不变。

预期对象

enter image description here

但我得到了

enter image description here

我如何解决这个问题?如果我检查默认的DateTime和int值,我将被限制为使用大于0的值作为int属性。 我需要检查null而不是默认值

public class Program
{
    public static void Main(string[] args)
    {
        Mapper.Initialize(config =>
        {
            config.CreateMap<ViewModel,Model>().ForAllMembers(opt => opt.Condition(
               (source, destination, sourceMember, destMember) => sourceMember != null));
        });


        var newModel = new Model
        {
            Name = "My Name",
            Age = 18,
            DateOfBirth = new DateTime(2000, 1, 1)
        };

        var newViewModel = new ViewModel();

        //Nulls should be ignored while mapping
        Mapper.Map(newViewModel, newModel);
    }
}

public class Model
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime DateOfBirth { get; set; }
}
public class ViewModel
{
    public string Name { get; set; }
    public int? Age { get; set; }

    public DateTime? DateOfBirth { get; set; }
}

1 个答案:

答案 0 :(得分:0)

只需更正您的映射

ta[x]

并且您的映射器首先使用源,然后使用目标

 config.CreateMap<Model, ViewModel>().ForAllMembers(opt => opt.Condition(
               (source, destination, sourceMember, destMember) => sourceMember != null));
相关问题