1

DTO オブジェクトをファクトリ クラスのエンティティ オブジェクトにマップしようとしています。DTO にはすべてのフィールド値がそのまま含まれていますが、エンティティには名前と値で構成されるフィールドがあります。

いくつかのデバッグの後、Automapper が既存のエンティティ フィールドを使用する代わりに各エンティティ フィールドをインスタンス化していることがわかりました。その結果、最後のテストは失敗します。

[TestFixture]
class RecursiveMappingTest
{
    public class SourceInfo
    {
        public string Info1 = "info1";
        public string Info2 = "info1";
    }

    public class StringField
    {
        public string Name;
        public string Value;
    }

    public class DestinationInfo
    {
        public StringField Info1 = new StringField() { Name = "field name 1" };
        public StringField Info2 = new StringField() { Name = "field name 2" };
    }

    [Test]
    public void MapField()
    {
        Mapper.CreateMap<string, StringField>()
            .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src));

        Mapper.CreateMap<SourceInfo, DestinationInfo>();

        SourceInfo sourceInfo = new SourceInfo();
        DestinationInfo destinationInfo = new DestinationInfo();

        Mapper.Map(sourceInfo, destinationInfo);

        // these pass
        Assert.That(destinationInfo.Info1.Value, Is.EqualTo("info1"));
        Assert.That(destinationInfo.Info2.Value, Is.EqualTo("info1"));

        // this fails since automapper instantiated brand new StringField()
        // which has Name == "".
        Assert.That(destinationInfo.Info1.Name, Is.EqualTo("field name 1"));
    }
}

これは予想される動作ですか?どうすれば私が望むものを達成できますか? エンティティ クラスには大量のフィールドがあるため、この回避策はうまくいきません

4

1 に答える 1

1

2番目のマップを次のように変更してみてください。

Mapper.CreateMap<SourceInfo, DestinationInfo>()
.ForAllMembers(x => x.UseDestinationValue());

これは、マップされていないすべての属性に宛先値を使用する必要があります。

于 2012-09-21T02:00:41.283 に答える