[C#] Ignora mappare una proprietà con Automapper


Answers

Sono forse un po 'un perfezionista; Non mi piace molto la sintassi ForMember (..., x => x.Ignore ()). È una piccola cosa, ma è importante per me. Ho scritto questo metodo di estensione per renderlo un po 'più bello:

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

Può essere usato in questo modo:

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

Potresti anche riscriverlo per lavorare con params , ma non mi piace l'aspetto di un metodo con un sacco di lambda.

Question

Sto usando Automapper e ho il seguente scenario: Class OrderModel ha una proprietà chiamata 'ProductName' che non è nel database. Quindi quando provo a fare la mappatura con:

Mapper.CreateMap<OrderModel, Orders>(); 

Genera un'eccezione:

"Le seguenti proprietà 1 su Project.ViewModels.OrderModel non sono mappate: 'ProductName'

Ho letto su Wiki di AutoMapper per Proiezioni il caso opposto (l'attributo extra è sulla destinazione, non nella fonte che è in realtà il mio caso)

Come posso evitare che l'automapper effettui la mappatura di questa proprietà?




Solo per chiunque cerchi di farlo automaticamente, è possibile utilizzare tale metodo di estensione per ignorare le proprietà non esistenti sul tipo di destinazione:

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

essere usato come segue:

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

grazie a Can Gencer per la punta :)

fonte: http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/




Quando si effettua il mapping di un modello di vista su un modello di dominio, può essere molto più semplice convalidare semplicemente l'elenco dei membri di origine anziché l'elenco dei membri di destinazione

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

Ora la convalida della mia mappatura non fallisce, richiedendo un altro Ignore() , ogni volta che aggiungo una proprietà alla mia classe di dominio.




Ciao a tutti Si prega di usare questo sta funzionando bene ... per auto mapper utilizzare più .ForMember in 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;