Двунаправленное сопоставление AutoMapper

Если я хочу сделать двунаправленное сопоставление, нужно ли мне создавать два сопоставления?

Mapper.CreateMap<A, B>() and Mapper.CreateMap<B, A>()?


person Benny    schedule 13.03.2010    source источник


Ответы (4)


Да, потому что если вы измените тип какого-либо свойства (например, DateTime -> строка), оно не будет двунаправленным (вам нужно будет указать Automapper, как преобразовать строку -> DateTime).

person Darin Dimitrov    schedule 13.03.2010
comment
Это имеет смысл, но было бы неплохо, если бы библиотека ПОПЫТАЛАСЬ сделать сопоставление по соглашению, и вы могли бы явно отключить его, если оно не работает. Например, я сопоставляю объекты предметной области с моделями представлений, и двунаправленное сопоставление идеально подходит для меня. - person John B; 17.01.2012

Да, но если вы обнаружите, что делаете это часто:

public static class AutoMapperExtensions
{
    public static void Bidirectional<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
    {
        Mapper.CreateMap<TDestination, TSource>();
    }
}

тогда:

Mapper.CreateMap<A, B>().Bidirectional();
person Eric Hauser    schedule 24.10.2010
comment
хотя это может и не ответить на вопрос, но, безусловно, решает основную проблему, поставленную - person hanzolo; 24.02.2015
comment
Устарело в 4.2, удалено в 5 :( stackoverflow.com/questions/38194012/ - person Jim Elrod; 04.06.2017

Теперь это встроено в AutoMapper.

Mapper.CreateMap<SourceType, DestType>().ReverseMap();
person ASG    schedule 30.01.2015
comment
Это не работает с пользовательскими сопоставлениями, только если имена свойств одинаковы в обоих классах. - person Michael Brown; 06.02.2016
comment
@MichaelBrown даже тогда ReverseMap, вызванный IMappingExpression<SourceType, DestType>, возвращает IMappingExpression<DestType, SourceType>, поэтому затем можно определить обратное пользовательское сопоставление. Я перемещаю это как новый принятый ответ. - person Bondolin; 27.02.2020

Отличная идея Эрик! Я добавил возвращаемое значение, так что обратное отображение тоже можно настроить.

public static class AutoMapperExtensions
{
    public static IMappingExpression<TDestination, TSource> Bidirectional<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
    {
        return Mapper.CreateMap<TDestination, TSource>();
    }
}
person Paolo Sanchi    schedule 04.01.2013