Ignoruj mapowanie jednej właściwości za pomocą Automapper

Używam Automapp i mam następujący scenariusz: Klasa OrderModel ma właściwość o nazwie 'ProductName', której nie ma w bazie danych. Więc kiedy próbuję zrobić mapowanie z:

Mapper.CreateMap<OrderModel, Orders>(); 

Generuje wyjątek:

" następujące 1 właściwości w projekcie.ViewModels.OrderModel nie jest mapowany: 'ProductName'

Przeczytałem na AutoMapper ' s Wiki for projects przeciwny przypadek (dodatkowy atrybut jest na miejscu docelowym, a nie w źródle, które jest w rzeczywistości moja sprawa)

W Jaki Sposób mogę uniknąć mapowania tej właściwości przez automapp?

Author: Andries Koorzen, 2011-02-14

8 answers

Od Jimmy Bogard: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());

Jest w jednym z komentarzy na jego blogu .

 340
Author: smartcaveman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-27 12:28:53

Jestem chyba trochę perfekcjonistą; nie bardzo podoba mi się forma (..., X => X.Ignore()) składnia. To drobiazg, ale dla mnie ma znaczenie. Napisałem tę metodę rozszerzenia, aby uczynić ją nieco ładniejszą:

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;
}

Można go używać tak:

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

Można też przepisać go do pracy z params, ale nie podoba mi się wygląd metody z ładunkiem lambda.

 207
Author: Steve Rukuts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-29 08:23:56

Możesz to zrobić:

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.Ignore());
 69
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-16 19:12:42

Jest teraz (AutoMapper 2.0) atrybut IgnoreMap, którego użyję zamiast płynnej składni, która jest nieco ciężka IMHO.

 25
Author: Guillaume,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 08:45:51

Tylko dla każdego, kto próbuje zrobić to automatycznie, możesz użyć tej metody rozszerzenia, aby zignorować nieistniejące właściwości w typie docelowym:

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;
}

Stosować w następujący sposób:

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

Podziękowania dla Can Gencer za napiwek:)

Źródło : http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/

 24
Author: Stéphane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-13 15:30:19

Podczas mapowania modelu widoku z powrotem do modelu domeny, łatwiejsze może być po prostu sprawdzenie listy członków źródłowych zamiast listy członków docelowych

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

Teraz moja Walidacja Map nie zawodzi, wymagając innej Ignore(), za każdym razem, gdy dodaję właściwość do mojej klasy domeny.

 10
Author: Loren Paulsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 03:49:07

Doceniłem rozszerzenie dodane przez Steve ' a Rukutsa, więc postanowiłem dodać jeszcze jedną metodę rozszerzenia opartą na jego przykładzie. Mam nadzieję, że komuś pomoże:

    public static IMappingExpression<TSource, TDestination> Map<TSource, TDestination>(
        this IMappingExpression<TSource, TDestination> map,
        Expression<Func<TSource, object>> src,
        Expression<Func<TDestination, object>> dst)
    {
        map.ForMember(dst, opt => opt.MapFrom(src));
        return map;
    }

Użycie:

    Mapper.Initialize(cfg => cfg.CreateMap<UserModel, UserDto>()
        .Map(src => src.FirstName + " " + src.LastName, dst => dst.UserName));
 -2
Author: Alex Valchuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 09:12:51

Witam wszystkich proszę użyć tego działa dobrze... dla auto mapper użyj multiple .ForMember w C #

        if (promotionCode.Any())
        {
            Mapper.Reset();
            Mapper.CreateMap<PromotionCode, PromotionCodeEntity>().ForMember(d => d.serverTime, o => o.MapFrom(s => s.promotionCodeId == null ? "date" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", DateTime.UtcNow.AddHours(7.0))))
                .ForMember(d => d.day, p => p.MapFrom(s => s.code != "" ? LeftTime(Convert.ToInt32(s.quantity), Convert.ToString(s.expiryDate), Convert.ToString(DateTime.UtcNow.AddHours(7.0))) : "Day"))
                .ForMember(d => d.subCategoryname, o => o.MapFrom(s => s.subCategoryId == 0 ? "" : Convert.ToString(subCategory.Where(z => z.subCategoryId.Equals(s.subCategoryId)).FirstOrDefault().subCategoryName)))
                .ForMember(d => d.optionalCategoryName, o => o.MapFrom(s => s.optCategoryId == 0 ? "" : Convert.ToString(optionalCategory.Where(z => z.optCategoryId.Equals(s.optCategoryId)).FirstOrDefault().optCategoryName)))
                .ForMember(d => d.logoImg, o => o.MapFrom(s => s.vendorId == 0 ? "" : Convert.ToString(vendorImg.Where(z => z.vendorId.Equals(s.vendorId)).FirstOrDefault().logoImg)))
                .ForMember(d => d.expiryDate, o => o.MapFrom(s => s.expiryDate == null ? "" : String.Format("{0:dd/MM/yyyy h:mm:ss tt}", s.expiryDate))); 
            var userPromotionModel = Mapper.Map<List<PromotionCode>, List<PromotionCodeEntity>>(promotionCode);
            return userPromotionModel;
        }
        return null;
 -3
Author: ravikant sonare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 14:04:38