我想从源的子对象映射到目标(作为父对象)。Automapper - 如何从源子对象映射到目标
源模型:
public class SourceBaseResponse<T> where T : new()
{
public string Type { get; set; }
public string Id { get; set; }
public T Attributes { get; set; }
}
对于我的例子中我使用T-为类型SourceAssignment的
public class SourceAssignment
{
public string Id { get; set; }
public string Email { get; set; }
public string EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTimeOffset CreatedAt { get; set; }
}
目标对象
public class DestinationAssignment
{
public string Id { get; set; }
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
我想源模型直接映射到目的地。所以,我试图用
CreateMap<SourceAssignment, DestinationAssignment>();
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
.ForMember(dest => dest, opt => opt.MapFrom(src => AutoMapperConfig.Mapper.Map<DestinationAssignment>(src.Attributes)));
,因为我在上面行获得运行时错误这不是工作“为成员自定义配置仅支持一个类型的顶级个人会员。”
所以,每this thread我尝试以下
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>()
.AfterMap((src, dst) => Mapper.Map(src.Attributes, dst));
现在,我得到错误的映射应该发生它说“映射器未初始化。调用适当的配置初始化。如果你试图使用映射器通过容器或其他方式实例,请确保您没有任何对静态Mapper.Map方法的调用,并且如果您使用的是ProjectTo或UseAsDataSource扩展方法,请确保您传入相应的IConfigurationProvider实例。
我能够使用ForMember每个属性和src.Attributes它映射到dest(对于如:src.Attribute.Id到dest.Id)。这是有效的,但我真的不想这样做,因为我的Source是涉及嵌套子元素的复杂类(因为这是一个Web API响应,我无法控制这个)。所以很多定制映射在这里完成
CreateMap<SourceAssignment, DestinationAssignment>();
关于如何继续的任何建议。
的'AfterMap'表达式使用静态'Mapper',所以要确定它已配置(即静态映射器具有SourceAssignment的映射 - > DestinationAssignment)。也许你正在配置一个实例,而不是静态映射器? –
@GeorgPatscheider它是一个静态映射器。如果没有从SourceBaseResponse进行映射,我可以将它用于自动映射源到目标。 – sam113