【问题标题】:AutoMapper to map a child list objectAutoMapper 映射一个子列表对象
【发布时间】:2018-06-17 06:03:07
【问题描述】:

我正在使用通用方法使用 Automapper 映射两个类

我的通用方法

public class AutoMapperConfiguration
{
    public MapperConfiguration Configure<TSource, TDestination>() where TSource:class where TDestination:class
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<ClientMappingProfile<TSource,TDestination>>();
        });
        return config;
    }
}

ClientMappingProfile.cs

public class ClientMappingProfile<TSource,TDestination>: Profile where TSource : class where TDestination:class 
{
    public ClientMappingProfile()
    {
        CreateMap<TSource, TDestination>().ReverseMap();
    }
}

StudentDetailsViewModel.cs

public class StudentDetailsViewModel
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public List<QualificationViewModel> listQualificationViewModel { get; set; }
}

QualificationViewModel.cs

public class QualificationViewModel
{
    public long ID { get; set; }
    public long StudentID { get; set; }
    public string ExaminationPassed { get; set; }
}

StudentValueObject.cs

public class StudentValueObject
{
    public long ID { get; set; }
    public string FirstName { get; set; }
    public List<StudentQualificationValueObject> listStudentQualificationValueObject { get; set; }
}

StudentQualificationValueObject.cs

public class StudentQualificationValueObject
{
    public long ID { get; set; }
    public long StudentID { get; set; }
    public string ExaminationPassed { get; set; }
}

用法

StudentValueObject studentValueObject = new StudentValueObject();
var config = new AutoMapperConfiguration().Configure<StudentValueObject, StudentDetailsViewModel>();
var iMapper = config.CreateMapper();
studentValueObject = iMapper.Map<StudentDetailsViewModel, StudentValueObject>(objStudentModel);

所以,这适用于映射 StudentDetailsViewModel.cs 和 StudentValueObject.cs。但它默默地无法将我的子列表对象(List&lt;QualificationViewModel&gt;)复制到List&lt;StudentQualificationValueObject&gt;。子列表对象似乎总是null。我是 AutoMapper 的新手。我需要一些帮助来了解我哪里出错了或者需要在我的通用方法中添加/修复什么,以便将子列表对象与父对象一起复制到。

更新 -

目前我正在使用以下代码进行此操作,并且它工作正常,但我很困惑这是正确的做法。

StudentValueObject studentValueObject = new StudentValueObject();
var config = new AutoMapperConfiguration().Configure<StudentValueObject, StudentDetailsViewModel>();
var iMapper = config.CreateMapper();
studentValueObject = iMapper.Map<StudentDetailsViewModel, StudentValueObject>(objStudentModel);
config = new AutoMapperConfiguration().Configure<StudentQualificationValueObject, QualificationViewModel>();
iMapper = config.CreateMapper();
studentValueObject.listStudentQualificationValueObject = iMapper.Map<List<QualificationViewModel>, List<StudentQualificationValueObject>>(objStudentModel.listQualificationViewModel);

【问题讨论】:

  • 您的配置需要包含有关如何从StudentQualificationValueObject 映射到QualificationViewModel 的定义。否则它不知道如何转换这些类型,但你不需要为集合定义转换,只为类型本身定义。
  • 请看我的更新。

标签: c# asp.net-mvc asp.net-mvc-5 automapper-6


【解决方案1】:

您必须映射列表属性,因为它们在给定的父类型中具有不同的名称,并且您必须为两个列表中使用的类型添加映射。这是您的代码的工作示例:

public class StudentsMappingProfile : Profile
{
    public StudentsMappingProfile()
    {
        CreateMap<StudentValueObject, StudentDetailsViewModel>()
            .ForMember(viewModel => viewModel.listQualificationViewModel, conf => conf.MapFrom(value => value.listStudentQualificationValueObject));
        CreateMap<StudentQualificationValueObject, QualificationViewModel>();
    }
}

public class Program
{
    public static void Main()
    {
        var config = new MapperConfiguration(cfg => cfg.AddProfile<StudentsMappingProfile>());
        var mapper = config.CreateMapper();

        var source = new StudentValueObject { ID = 73, FirstName = "Hello", listStudentQualificationValueObject = new List<StudentQualificationValueObject> { new StudentQualificationValueObject { ID = 42, StudentID = 17, ExaminationPassed = "World" } } };
        var destination = mapper.Map<StudentDetailsViewModel>(source);

        Console.ReadKey();
    }
}

【讨论】:

  • 谢谢奥利弗。它现在工作。我们能不能让它更通用,如果我们将类作为参数传递,它应该自动映射子对象。此外,它处理空对象。
  • 一开始我也尝试过这种通用方法。不幸的是,它不能很好地工作,因为您几乎总是在对象树映射的某个地方进行一些特殊处理。恕我直言,创建配置文件(就像我在回答中所做的那样)并从不同的配置文件创建映射器效果更好。
  • 是的,在使其更通用的同时面临同样的问题。所以不得不去创建不同的配置文件方法。
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2012-02-25
相关资源
最近更新 更多