2

私は次のクラス構造を持っています:

public class A
{
    public bool Property1 { get; set; }
    public bool Property2 { get; set; }
}

public class ContainerForA
{
    public A A { get; set; }
}

public class A1
{
    public bool Property1 { get; set; }
}

public class ContainerForA1
{
    public A1 A { get; set; }
}

このクラスのセットのマッピングを作成します。

Mapper.CreateMap<A1, A>();
Mapper.CreateMap<ContainerForA1, ContainerForA>();

このクラスのセットのインスタンスを作成します。

        var cnt_a = new ContainerForA()
                        {
                            A = new A()
                                    {
                                        Property1 = false,
                                        Property2 = true
                                    }
                        };

        var cnt_a1 = new ContainerForA1()
                         {
                             A = new A1()
                                     {
                                         Property1 = true
                                     }
                         };

電話をかけると、期待した結果が得られます。オブジェクトcnt_aMapper.Map(cnt_a1.A, cnt_a.A)のプロパティ(Property1と)の両方がtrueです。Property2

しかし、私が電話すると、Mapper.Map(cnt_a1, cnt_a)私は真になりProperty1、偽になりますProperty2。誰かが私に理由を説明できますか?また、宛先オブジェクトには存在するがソースオブジェクトには存在しないプロパティが失われないように、マッピングを宣言するオプションはありますか?

4

1 に答える 1

4

ContainerForA1からにマップするとContainerForA、プロパティAをマップすると、既存のインスタンスを使用するのではなく、 Aforの新しいインスタンスが作成されると思います。ContainerForAこれにより、すべてのプロパティのデフォルト値(。)が使用されfalseますbool

これをどのように回避しますか?

まず、ContainerForAのプロパティAを上書きしないようにAutoMapperに指示する必要があります。そのために、AutoMapperにプロパティを無視するように指示します。

Mapper.CreateMap<ContainerForA1, ContainerForA>()
    .ForMember(cForA => cForA.A, option => option.Ignore());

次に、AfterMapを使用してAを手動で更新する必要があります

Mapper.CreateMap<ContainerForA1, ContainerForA>()
    .ForMember(cForA => cForA.A, option => option.Ignore())
    .AfterMap((cForA1, cForA) => Mapper.Map(cForA1.A, cForA.A));

おそらく、AfterMapメソッドにいくつかのチェックを追加して、cForA.Aがnullでないことを確認することをお勧めします。それはあなたにお任せします。

于 2012-07-05T15:09:05.680 に答える