Наследование Automapper - повторное использование карт - PullRequest
8 голосов
/ 02 июня 2011

Я пытаюсь использовать automapper, чтобы создать одну карту для родительского объекта и повторно использовать ее среди своих дочерних объектов.

Для дочерних свойств я хочу отобразить только дополнительные поля.

Это возможно?Код, который у меня есть, выглядит следующим образом

CreateCalculationMap(message);  ---- This does the BASE parent mappping.
    Mapper.CreateMap<QuoteMessage, CalculationGipMessage>()                     -- This is the child.
        .Include<QuoteMessage, CalculationBase>()                               -- Include the parent?
        .ForMember(a => a.OngoingCommission, b => b.MapFrom(c => c.OngoingASF)) - Child
        .ForMember(a => a.SpecialRate, b => b.MapFrom(c => c.BlahBlah)));       - Child

Почему он постоянно сообщает мне, что родительские свойства не сопоставлены?Тем не менее, я думал, что включил их в CreateCalculationMap (сообщение);который содержит

Mapper.CreateMap<QuoteMessage, CalculationBase>() ()

Ответы [ 2 ]

6 голосов
/ 21 сентября 2011

К вашему сведению, я понял это

 public static IMappingExpression<A, T> ApplyBaseQuoteMapping<A, T>(this   IMappingExpression<A, T> iMappingExpression)
        where A : QuoteMessage
        where T : CalculationGipMessage
    {
        iMappingExpression
            .ForMember(a => a.LoginUserName, b=> b.MapFrom(c => c.LoginUserName))
            .ForMember(a => a.AssetTestExempt, b => b.Ignore())
            ;

        return iMappingExpression;
    }


Mapper.CreateMap<QuoteMessage, CalculationGipMessageChild>()
            .ApplyBaseQuoteMappingToOldCol()
             // do other mappings here
0 голосов
/ 18 июня 2011

Вы не можете сделать это, я не думаю - вам нужно составить сопоставления.На самом деле это может быть ошибкой, так как вики заявляют, что это возможно, однако приведенный пример просто полагается на имя свойств для сопоставления, а не на бит включения.По крайней мере, я так понимаю.

Если вы посмотрите на http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays и измените имя свойств в Source и Dest (я делаю их Value 3 и Value4, чтобы действительно смешивать вещи), затем явно добавьте свои сопоставления.

    Mapper.CreateMap<ChildSource, ChildDestination>()
            .ForMember( x => x.Value4, o => o.MapFrom( y => y.Value2 ) );
        Mapper.CreateMap<ParentSource, ParentDestination>()
            .Include<ChildSource, ChildDestination>()
            .ForMember( x => x.Value3, o => o.MapFrom( y => y.Value1 ) );

Тогда, похоже, произойдет сбой.

        ChildSource s = new ChildSource()
        {
            Value2 = 1,
            Value1 = 3
        };

        var c = s.MapTo<ChildDestination>();
        var c2 = s.MapTo<ParentDestination>();

        Assert.AreEqual( c.Value3, s.Value1 );
        Assert.AreEqual( c.Value4, s.Value2 );
        Assert.AreEqual( c2.Value3, s.Value1 );
        Assert.AreEqual( c.Value4, s.Value2 );

Другие примечания

Кроме того, в поле «Включить» должен быть ребенок, а не родитель,Прототип на самом деле утверждает, что

    public IMappingExpression<TSource, TDestination> Include<TOtherSource, TOtherDestination>()
        where TOtherSource : TSource
        where TOtherDestination : TDestination

Из того, что я прочитал, вы должны сначала создать свое дочернее отображение, хотя, возможно, это была старая проблема.

Mapper.CreateMap<ChildSource, ChildDest>();

Затем ваш родитель

Mapper.CreateMap<ParentSource, Parent Dest>()
       .Include<ChildSource, ChildDest>();

Источник http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...