it-swarm-ru.tech

Игнорировать сопоставление одного свойства с Automapper

Я использую Automapper и у меня есть следующий сценарий: Класс OrderModel имеет свойство ProductName, которого нет в базе данных. Поэтому, когда я пытаюсь сделать сопоставление с:

Mapper.CreateMap<OrderModel, Orders>(); 

Это генерирует исключение:

"Следующие 1 свойства в Project.ViewModels.OrderModel не сопоставлены:" ProductName "

Я читал в Wiki для проекций AutoMapper обратный случай (дополнительный атрибут находится в месте назначения, а не в источнике, который фактически является моим случаем)

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

249
Msam85

От Джимми Богарда: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());

Это в один из комментариев в его блоге .

405
smartcaveman

Я, возможно, немного перфекционист; Мне не очень нравится синтаксис ForMember (..., x => x.Ignore ()). Это мелочь, но это важно для меня. Я написал этот метод расширения, чтобы сделать его немного лучше:

public static IMappingExpression<TSource, TDestination> Ignore<TSource, TDestination>(
    this IMappingExpression<TSource, TDestination> map,
    Expression<Func<TDestination, object>> selector)
{
    map.ForMember(selector, config => config.Ignore());
    return map;
}

Это можно использовать так:

Mapper.CreateMap<JsonRecord, DatabaseRecord>()
        .Ignore(record => record.Field)
        .Ignore(record => record.AnotherField)
        .Ignore(record => record.Etc);

Вы также можете переписать его для работы с params, но мне не нравится внешний вид метода с множеством лямбд.

222
Steve Rukuts

Вы можете сделать это:

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.Ignore());
75
Richard

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

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var sourceType = typeof(TSource);
    var destinationType = typeof(TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType)
        && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

использоваться следующим образом:

Mapper.CreateMap<SourceType, DestinationType>().IgnoreAllNonExisting();

спасибо Can Gencer за отзыв :)

источник: http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/

28
Stéphane

Теперь есть (AutoMapper 2.0) атрибут IgnoreMap, который я собираюсь использовать, а не беглый синтаксис, который немного тяжелый ИМХО.

28
Guillaume

При отображении модели представления обратно в модель домена, может быть намного проще просто проверить исходный список членов, а не целевой список членов.

Mapper.CreateMap<OrderModel, Orders>(MemberList.Source); 

Теперь моя проверка сопоставления не завершается неудачей, требуя еще одну Ignore(), каждый раз, когда я добавляю свойство в мой класс домена.

19
Loren Paulsen