自动映射深度映射,忽略空成员

时间:2017-08-02 13:25:32

标签: c# asp.net-core-mvc automapper

我正在尝试使用Automapper来完成ViewModel和POCO之间的映射。 我有一个视图,在页面上显示问题,显示Text和一个复选框 - 设置Selected属性。 这是回发的,控制器将其映射回现有应用程序数据的顶部。由于Text没有回发,我不想将其删除,因此在ViewModel值为null时尝试忽略Text映射。但它不起作用。当我使用Question和QuestionViewModel尝试测试时 - 映射工作正常,如下所示。

我有以下

public class Question{
  public string Text {get;set;}
  public bool Selected {get;set;}
}
public class QuestionViewModel{
  public string Text{get;set;}
  public bool Selected {get;set;}
}
and the mapping I have setup like this:
CreateMap<Question, QuestionViewModel>();
CreateMap<QuestionViewModel, Question>().
  .ForMember(q => q.Selected, opt => opt.MapFrom(vm => vm.Selected))
  .ForMember(q => q.Text, opt => opt.Condition((s, d, m) => !string.IsNullOrEmpty(m)));

我已成功测试并且一切都很好

Mapper.Map(questionViewModelInstance, questionInstance);

这正确设置了QuestionInstance上的Selected而不覆盖text,在questionViewModel中为null。

但是,当我将这些问题类型作为其他课程的孩子时,事情就不那么顺利了

public class QuestionsViewModel{
  public IList<QuestionViewModel> Questions{get;set;}
}
public class Application{
  public Product Product {get;set;}
..other properties omitted
}
public class Product{
  public IList<Question> Questions {get;set;}
..other properties omitted
}

和映射 - 与上面的映射一起使用

CreateMap<Application, QuestionsViewModel>()
  .ForMember(qvm=>qvm.Questions, opt=>opt.MapFrom(a=>a.Product.Questions));
CreateMap<QuestionsViewModel, Application>()
  .ForMember(a=>a.Product, opt=>opt.MapFrom(qvm=>qvm));
CreateMap<QuestionsViewModel, Product>();
CreateMap<Product, QuestionsViewModel>();

尝试使用上述相同的Questions / QuestionViewModel数据

Mapper.Map(questionsViewModel, application)

错误地擦除了Application.Product.Questions上的Text属性。

我在这里缺少什么/做错了什么? 任何帮助非常感谢

1 个答案:

答案 0 :(得分:1)

首先清除目标集合。可能是Automapper, updating an object with a child list of objects的副本。

相关问题