首页 文章

忽略使用Automapper映射一个属性

提问于
浏览
218

我正在使用Automapper,我有以下场景:类OrderModel有一个名为'ProductName'的属性,它不在数据库中 . 所以,当我尝试使用以下方法进行映射时:

Mapper.CreateMap<OrderModel, Orders>();

它会生成一个异常:

“Project.ViewModels.OrderModel上的以下1个属性未映射:'ProductName'

我在AutoMapper's Wiki for Projections读过相反的情况(额外的属性在目的地,而不是在源,这实际上是我的情况)

如何避免使用automapper来映射此属性?

8 回答

  • 71

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

    它在one of the comments at his blog .

  • 27

    我可能是一个完美主义者;我不太喜欢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 ,但我不喜欢带有大量lambdas的方法的外观 .

  • 24

    你可以这样做:

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

    现在(AutoMapper 2.0)有一个IgnoreMap属性,我将使用它而不是流畅的语法,这有点笨笨 .

  • 211

    对于任何尝试自动执行此操作的人,您可以使用该扩展方法忽略目标类型上的非现有属性:

    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/

  • -3

    将视图模型映射回域模型时,简单地验证源成员列表而不是目标成员列表可以更简洁

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

    现在我的映射验证不会失败,每次我向域类添加属性时都需要另一个 Ignore() .

  • -3

    你好所有请使用此工作正常...自动映射器在C#中使用多个 .ForMember

    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;
    
  • 12

    我很欣赏Steve Rukuts添加的扩展程序,因此我决定根据他的示例添加一个扩展方法 . 希望它会帮助某人:

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

    用法:

    Mapper.Initialize(cfg => cfg.CreateMap<UserModel, UserDto>()
            .Map(src => src.FirstName + " " + src.LastName, dst => dst.UserName));
    

相关问题