7

AutoMapper を使用して複数のオブジェクトのデータをマージしようとしていますが、解決できない問題がいくつかあります。

次のようなオブジェクトがあります。

public class Parent
{
    public string Id { get; set; }
    public List<Child> Children { get; set; }
}
public class Child
{
    public string Key { get; set; }
    public int? Value1 { get; set; }
    public int? Value2 { get; set; }
    public int? Value3 { get; set; }
    public int? Value4 { get; set; }
    public int? Value5 { get; set; }
}

明らかに、子プロパティはすべて int ではありませんが、それらのほとんどは null 許容です。

アプリケーションの 2 つの異なる層にこれらのオブジェクトがあるため、AutoMapper を使用してそれらの間で変換しています。

{
    Mapper.CreateMap<Parent, ParentDTO>();
    Mapper.CreateMap<ParentDTO, Parent>();

    Mapper.CreateMap<Child, ChildDTO>();
    Mapper.CreateMap<ChildDTO, Child>();
}

変換はうまく機能し、その結果に満足しています。ただし、同じタイプの複数のオブジェクトをマージする必要があります。ほとんどまたはすべてのプロパティが設定されたオブジェクトのコピーが 1 つと、いくつかのプロパティのみが設定され、残りが null の別のコピーが作成されます。2 番目の (部分的な) オブジェクトの null 以外のプロパティを、最初の (既に入力されている) オブジェクトのそれぞれのフィールドにマップする必要があります。この回答に対する受け入れられた回答が述べているように、AutoMapper を使用してこれを行うこともできるはずですが、明確な例はありません。

しかし、操作を実行すると、どちらかのオブジェクトと同一のオブジェクトが得られますが、必要に応じて結合されていません。

{
    var bigParent = new Parent
    {
        Id = "14",
        Children = new List<Child>
        {
            new Child
            {
                Key = "A",
                Value1 = 10,
                Value2 = 20,
                Value3 = 30,
                Value4 = 40,
                Value5 = 50
            }                   
        }
    };

    var merge = new Parent
    {
        Id = "14",
        Children = new List<Child>
        {
            new Child
            {
                Key = "A",
                Value1 = null,
                Value2 = null,
                Value3 = 100,
                Value4 = null,
                Value5 = null
            }
        }
    };

    var res = Mapper.Map(merge, bigParent);
}

Child が 10、20、100、40、50 の値を持つことを期待しています。ただし、Mapper.Map でソースまたは宛先としてマージを配置するかどうかに応じて、null、null、100、null、null、または 10、20 のいずれかを取得します。 、30、40、50。

期待値を取得する方法はありますか? エンティティを並べる方法がわからないため(同じかどうかを判断するため)、リストを持っていることが問題の原因であると考えています。質問に答えれば、1 つ以上のプロパティ (この例では Key) が同じかどうかを確認することで、子レコードが同じかどうかを識別できます。

4

2 に答える 2

5

Automapper はこれが可能です。マッパーを次のように構成する必要があります。

Mapper.Initialize(cfg =>
{
    // necessary if you are mapping parent to a parent
    cfg.CreateMap<Parent, Parent>()
        .ForAllMembers(options =>
        {
            options.Condition(src => src.DestinationValue == null);
        });
    // necessary if you are mapping your child to a child
    cfg.CreateMap<Child, Child>()
        .ForAllMembers(options =>
        {
            options.Condition(src => src.DestinationValue == null);
        });
});

そして、あなたの使い方:

var bigParent = new Parent
{
    Id = "14",
    Children = new List<Child>
    {
        new Child
        {
            Key = "A",
            Value1 = 10,
            Value2 = 20,
            Value3 = 30,
            Value4 = 40,
            Value5 = 50
        }
    }
};

var merge = new Parent
{
    Id = "14",
    Children = new List<Child>
    {
        new Child
        {
            Key = "A",
            Value1 = null,
            Value2 = null,
            Value3 = 100,
            Value4 = null,
            Value5 = null
        }
    }
};

var bigChild = new Child
{
    Key = "A",
    Value1 = 10,
    Value2 = 20,
    Value3 = 30,
    Value4 = 40,
    Value5 = 50
};

var mergeChild = new Child
{
    Key = "A",
    Value1 = null,
    Value2 = null,
    Value3 = 100,
    Value4 = null,
    Value5 = null
};

Mapper.Map(bigChild, mergeChild);
Debug.Assert(mergeChild.Value3 == 100);

Mapper.Map(bigParent, merge);
Debug.Assert(merge.Children[0].Value3 == 100);
于 2016-03-09T00:17:35.290 に答える