我面临使用Auto Mapper方法映射嵌套对象的问题 任何人都可以建议使用自动映射器
映射Source和Target类例如,这是示例代码。
来源:
Main Class:
public class EMP {
public int empid {get;set;}
public int Name {get;set;}
public EMPDetails Employeedata {get;set;}//Here is inner object in main class
public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class
}
public Class EMPDetails {
public String Name {get;set;}
public EmpAdd EmpAddress {get;set;}//Here is inner Object in one class
}
public class EmpAdd {
public int id {get;set;}
public int Street {get;set;}
}
public class EmpContact {
public int id {get;set;}
public int Mobile {get;set;}
}
:定位:
Main Class:
public class EMPInfo {
public int id {get;set;}
public int EmpName {get;set;}
public EMPPerdata Employeedata {get;set;}//Here is inner object in main class
public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class
}
public class EMPPerdata {
public String FullName {get;set;}
public EmpAdressInfo EmpAddress {get;set;}//Here is inner Object in one class
}
public class EmpAdressInfo {
public int id {get;set;}
public int Street {get;set;}
}
public class EmpContact {
public int id {get;set;}
public int Mobile {get;set;}
}
答案 0 :(得分:2)
原始答案
您需要为外部和内部类创建地图。
例如:
Mapper.CreateMap<Emp,EmpInfo>();
Mapper.CreateMap<EmpDetails,EMPPerdata>();
等...
然后:
EmpInfo Dest = Mapper.Map<Emp, EmpInfo>(srcObj);
这应该有效。
修改 (因为那不是一个好的答案)
所以,只是想添加此编辑以显示一些AutoMapper最佳实践,因为如果您遵循这些最佳实践,它会更容易使用。
AutoMapper个人资料
使用Automapper时,除非您正在映射非常简单的对象,否则设置映射的最佳方法是使用配置文件。要使用这些配置文件,请确保在程序中添加using AutoMapper;
,然后您可以创建映射配置文件,如下所示:
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<EMP, EMPInfo>();
}
}
现在,在您想要使用此配置文件的任何类中,您可以像这样使用它:
Mapper.Initialize(cfg =>
{
cfg.AddProfile<MappingProfile>();
});
EMPInfo empInfo = Mapper.Map<EMP, EMPInfo>(emp);
现在......你为什么要这么做呢?你可以很容易地说Mapper.CreateMap<EMP, EMPInfo>(); Mapper.Map<EMP, EMPInfo(src);
,它会做同样的事情。
按照我上面提到的方式做这件事的好处是三倍。
CreateMap()
行的映射配置文件,您只需初始化该配置文件然后再使用它。单元测试AutoMapper
在您的单元测试项目中(如果您没有,请添加一个,它是Visual Studio中的默认项目模板)您应该拥有一个包含以下单元测试的类:
[TestMethod]
public void AutoMapperConfigIsValid()
{
Mapper.Initialize(cfg =>
{
cfg.AddProfile<MappingProfile>();
// add all profiles you'll use in your project here
});
Mapper.AssertConfigurationIsValid();
}
现在,如果我使用您在上面列出的类运行该单元测试,并且我在其上面放置的映射配置文件将给出错误:
Unmapped Properties:
id
EmpName
这不是完整的错误,只是最重要的部分。发生了什么...... AutoMapper无法确定EMPInfo类型中id
和EmpName
字段的映射位置。
要解决此错误,我们需要将特定成员的映射添加到我们的个人资料中。我们的个人资料变为:
CreateMap<Source.EMP, Target.EMPInfo>()
.ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid))
.ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name));
我们在...中添加再次运行测试...得到一个新错误。
Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type TestStuff.Target.EmpContact.
Context:
Mapping from type TestStuff.Source.EmpContact to TestStuff.Target.EmpContact
Exception of type 'AutoMapper.AutoMapperConfigurationException' was thrown.
这告诉我们需要为我们映射的对象的嵌套成员添加一个映射。
要解决此问题,我们将以下地图添加到映射配置文件中:
CreateMap<Source.EmpContact, Target.EmpContact>();
现在你需要做什么,这是一个艰巨但必要的过程,继续运行配置测试并修复它给你的问题,直到测试没有失败。
解决所有问题后,映射配置文件如下所示:
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Source.EMP, Target.EMPInfo>()
.ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid))
.ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name));
CreateMap<Source.EmpContact, Target.EmpContact>();
CreateMap<Source.EMPDetails, Target.EMPPerdata>()
.ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
CreateMap<Source.EmpAdd, Target.EmpAdressInfo>();
}
}
此映射配置文件非常有效,可以很好地映射您的两个对象。
现在,这张地图对于一件小事似乎是很多工作,但这样做的好处来自于规模。如果您曾在大型适配器中使用AutoMapper。类型项目,这种结构化的代码将更容易导航,阅读和测试。
希望这会有所帮助。很抱歉,如果我在这里任何一点都走得太远,但希望这个答案可以帮助任何尝试使用AutoMapper的人。
您也可以在AutoMapper文档中找到我上面提到的一些内容的文档:https://github.com/AutoMapper/AutoMapper/wiki/Configuration
答案 1 :(得分:0)
您需要为所有模型创建地图
Mapper.CreateMap<EMP,EmpInfo>();
Mapper.CreateMap<EmpDetails,EMPPerdata>();
Mapper.CreateMap<EmpContact,EmpContact>();
Mapper.CreateMap<EmpAdd,EmpAdressInfo>();
然后:
Mapper.Map<Emp, EmpInfo>(someEmp);