0

我目前在尝试从源对象上的子属性映射整个目标对象时遇到问题。类似于此处描述的内容:Automapper - 如何从源子对象映射到目标

我已经使用了上面链接中描述的 .ConstructUsing 方法,但是我看到了一些奇怪的行为,其中输出的映射对象从父对象而不是子对象获取值。

我在这里做了一个问题的演示:https ://dotnetfiddle.net/OdaGUr

这是我的代码的问题,我应该使用不同的方法来实现我想要做的事情还是 AutoMapper 的错误?

编辑:

public static void Main()
{
    var config = new MapperConfiguration(cfg => {
        cfg.CreateMap<Child1, Child2>();
        cfg.CreateMap<Parent, Child2>().ConstructUsing((src, ctx) => ctx.Mapper.Map<Child2>(src.Child1));   
     });

    var mapper = config.CreateMapper();

    var parent = new Parent{
        Id = 1,
        Child1 = new Child1 {
            Id = 2
        }
    };

    var child2 = mapper.Map<Parent, Child2>(parent);
    Console.WriteLine(child2.Id); // Returns 1. Expect this to be 2 from Parent.Child1
}

public class Parent
{
    public int Id {get;set;}
    public Child1 Child1 {get;set;}
}

public class Child1
{
    public int Id {get;set;}
}

public class Child2
{
    public int Id {get;set;}
}
4

1 回答 1

1

ConstructUsing()用于创建目标对象,该值应存储在其中。在您的情况下,您将返回一个值设置为的Child2对象(如该行返回的那样)。Id2ctx.Mapper.Map<Child1, Child2>(src.Child1)

但是,在创建对象后,仍将应用默认映射。这意味着该Parent.Id值将保存在Child2.Id属性中,因为属性的名称匹配 ( "Id")。因此, 的初始值2将替换1Parent对象中的值。

根据您要执行的操作,您可能希望使用ForMember()来配置有关如何映射属性值的特殊处理。一个例子是:

.ForMember(dest => dest.Id, src => src.MapFrom(it => it.Child1.Id))
于 2020-06-12T16:00:24.750 回答