忽略使用Automapper映射一个属性

时间:2011-02-14 00:22:54

标签: c# model viewmodel automapper object-object-mapping

我正在使用Automapper,我有以下情况: OrderModel类具有一个名为“ProductName”的属性,该属性不在数据库中。 所以当我尝试用以下方法进行映射时:

Mapper.CreateMap<OrderModel, Orders>(); 

它会产生一个异常:

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

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

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

8 个答案:

答案 0 :(得分:401)

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

它在one of the comments at his blog

答案 1 :(得分:222)

我可能是一个完美主义者;我真的不喜欢ForMember(...,x =&gt; 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的方法外观。

答案 2 :(得分:75)

你可以这样做:

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

答案 3 :(得分:28)

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

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/

答案 4 :(得分:27)

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

答案 5 :(得分:19)

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

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

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

答案 6 :(得分:0)

可以在需要忽略的属性上使用IgnoreAttribute

答案 7 :(得分:-5)

Hello All请使用此工具正常...自动映射器在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;