簡體   English   中英

Automapper - 從源子 object 到目標的映射包括父值

[英]Automapper - Mapping from source child object to destination is including parent values

我目前在嘗試從源 object 上的子屬性 map 整個目標 object 時遇到問題。 類似於此處所述的內容: Automapper - 如何從源子 object 到目標的 map

我已經使用了上面鏈接中描述的 .ConstructUsing 方法,但是我看到一些奇怪的行為,其中輸出的映射 object 從父級而不是子級獲取值。

我在這里做了一個問題的演示: 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;}
}

ConstructUsing()用於創建目標 object,該值應存儲在其中。在您的情況下,您將返回一個Child2 object,其Id值設置為2 (由ctx.Mapper.Map<Child1, Child2>(src.Child1)返回ctx.Mapper.Map<Child1, Child2>(src.Child1)行)。

但是,在創建 object 后,仍將應用默認映射。 這意味着Parent.Id值將保存在Child2.Id屬性中,因為屬性的名稱匹配 ( "Id" )。 因此,初始值2將替換為父Parent中的值1

根據您想要執行的操作,您可能希望使用ForMember()來配置有關如何映射屬性值的特殊處理。 一個例子是:

.ForMember(dest => dest.Id, src => src.MapFrom(it => it.Child1.Id))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM