Automapper:不同类型之间的映射
Automapper: mapping between different types
假设我有一个 class 结构,例如
public class Entity
{
public List<EntityChild> Children { get; set; }
}
public class EntityChild
{
public int Id { get; set; }
public string Name { get; set; }
}
我想使用 AutoMapper 将 Entity
映射到 class EntityDto
并反转。
public class EntityDto
{
public List<int> EntityChildrenIds { get; set; }
}
我不知道如何配置 AutoMapper 以在两个方向上正确映射它。我知道当从 EntityDto
映射到 Entity
时,我的名字 属性 将为空,但这不是问题。
对于双向映射,此配置适用于我:
var mapperConfiguration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Entity, EntityDto>()
.ForMember(dest => dest.EntityChildrenIds, opt => opt.MapFrom(src => src.Children))
.ReverseMap();
cfg.CreateMap<EntityChild, int>().ConvertUsing(child => child.Id);
cfg.CreateMap<int, EntityChild>().ConvertUsing(id => new EntityChild
{
Id = id
});
});
由于属性具有不同的名称,我们需要配置该映射。
然后只需添加从 EntityChild
到 int
的通用映射,然后再返回,我们就完成了。
如果 .ReverseMap()
,正如@knoop 所提到的,没有工作,也许你应该手动映射它:
CreateMap<Entity, EntityDto>(MemberList.None)
.ForMember(dest => dest.EntityChildrenIds, opts => opts.MapFrom(src => MapChildrenIds(src.Children)));
CreateMap<EntityDto, Entity>(MemberList.None)
.ForMember(dest => dest.Children, opts => opts.MapFrom(src => MapChildren(src.EntityChildrenIds)));
private List<EntityChild> MapChildren(List<int> entityChildrenIds)
{
var listEntityChild = new List<EntityChild>();
foreach (var childId in entityChildrenIds)
listEntityChild.Add(new EntityChild { Id = childId });
return listEntityChild;
}
private List<int> MapChildrenIds(List<EntityChild> children)
{
return children.Select(x => x.Id).ToList();
}
假设我有一个 class 结构,例如
public class Entity
{
public List<EntityChild> Children { get; set; }
}
public class EntityChild
{
public int Id { get; set; }
public string Name { get; set; }
}
我想使用 AutoMapper 将 Entity
映射到 class EntityDto
并反转。
public class EntityDto
{
public List<int> EntityChildrenIds { get; set; }
}
我不知道如何配置 AutoMapper 以在两个方向上正确映射它。我知道当从 EntityDto
映射到 Entity
时,我的名字 属性 将为空,但这不是问题。
对于双向映射,此配置适用于我:
var mapperConfiguration = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Entity, EntityDto>()
.ForMember(dest => dest.EntityChildrenIds, opt => opt.MapFrom(src => src.Children))
.ReverseMap();
cfg.CreateMap<EntityChild, int>().ConvertUsing(child => child.Id);
cfg.CreateMap<int, EntityChild>().ConvertUsing(id => new EntityChild
{
Id = id
});
});
由于属性具有不同的名称,我们需要配置该映射。
然后只需添加从 EntityChild
到 int
的通用映射,然后再返回,我们就完成了。
如果 .ReverseMap()
,正如@knoop 所提到的,没有工作,也许你应该手动映射它:
CreateMap<Entity, EntityDto>(MemberList.None)
.ForMember(dest => dest.EntityChildrenIds, opts => opts.MapFrom(src => MapChildrenIds(src.Children)));
CreateMap<EntityDto, Entity>(MemberList.None)
.ForMember(dest => dest.Children, opts => opts.MapFrom(src => MapChildren(src.EntityChildrenIds)));
private List<EntityChild> MapChildren(List<int> entityChildrenIds)
{
var listEntityChild = new List<EntityChild>();
foreach (var childId in entityChildrenIds)
listEntityChild.Add(new EntityChild { Id = childId });
return listEntityChild;
}
private List<int> MapChildrenIds(List<EntityChild> children)
{
return children.Select(x => x.Id).ToList();
}