348

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

Mapper.CreateMap<OrderModel, Orders>(); 

它产生一个异常:

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

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

如何避免自动映射器进行此属性的映射?

4

9 回答 9

599

从吉米博加德: CreateMap<Foo, Bar>().ForMember(x => x.Blarg, opt => opt.Ignore());

这是在他博客上的评论之一

更新(来自Jamie 的评论 2019 年 1 月 4 日 11:11:)

在 ForSourceMember 中,忽略已被替换为DoNotValidatehttps ://github.com/AutoMapper/AutoMapper/blob/master/docs/8.0-Upgrade-Guide.md

于 2011-02-14T01:39:13.757 回答
263

我可能有点完美主义者;我不太喜欢这种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,但我不喜欢带有大量 lambda 的方法的外观。

于 2013-05-29T08:23:56.363 回答
92

你可以这样做:

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

或者,在最新版本的 Automapper 中,您只是想告诉 Automapper 不验证该字段

conf.CreateMap<SourceType, DestinationType>()
   .ForSourceMember(x => x.SourceProperty, y => y.DoNotValidate());
于 2012-04-16T19:12:42.777 回答
32

现在有(AutoMapper 2.0)一个IgnoreMap属性,我将使用它而不是流畅的语法,恕我直言。

于 2011-09-23T08:38:40.640 回答
29

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

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/

于 2013-02-13T15:30:19.383 回答
27

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

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

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

于 2015-06-15T03:49:07.550 回答
3

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

于 2019-10-28T15:48:39.773 回答
1

也可以忽略这样的全局属性:

  1. 使用AddGlobalIgnore(string propertyNameStartingWith)映射器配置中的方法忽略名称以指定字符串开头的属性。
  2. 使用ShouldMapProperty提供谓词并有条件地选择要映射的属性。ShouldMapFieldShouldMapMethod属性也可用。

用法 :

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        // other configs...

        AddGlobalIgnore("foo")); // this will ignore properties with name starting with "foo"
        ShouldMapProperty = p => p.Name != "bar"; // this will ignore properties with name "bar"
    }
}

或者 :

var config = new MapperConfiguration(cfg => {
    // other configs...
    cfg.AddGlobalIgnore("foo"); // way 1
    cfg.ShouldMapProperty = p => p.Name != "bar"; // way 2
});
于 2021-09-29T15:03:56.410 回答
-5

大家好,请使用它,它工作正常...对于自动映射器,在 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;
于 2015-12-15T14:30:47.283 回答