我正在使用Automapper,我有以下场景: 类OrderModel有一个名为“ProductName”的属性,该属性不在数据库中。 所以当我尝试用:

Mapper.CreateMap<OrderModel, Orders>(); 

它会生成一个异常:

" Project.ViewModels.OrderModel上的以下1个属性没有被映射:

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

我如何避免自动程序使这个属性的映射?


当前回答

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

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/

其他回答

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

在映射器配置中使用AddGlobalIgnore(string propertyNameStartingWith)方法来忽略以指定字符串开头的属性。 使用shouldmproperty提供一个谓词,并有条件地选择要映射的属性。ShouldMapField和ShouldMapMethod属性也可用。

用法:

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

Or :

var config = new MapperConfiguration(cfg => {
    // other configs...
    cfg.AddGlobalIgnore("foo"); // way 1
    cfg.ShouldMapProperty = p => p.Name != "bar"; // way 2
});

我可能是一个完美主义者;我不太喜欢这张…, 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的方法。

可以使用IgnoreAttribute属性需要被忽略

CreateMap<Foo, Bar>()。ForMember(x => x. blarg, opt => opt. ignore ());

这是他博客上的一条评论。

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

ForSourceMember中的Ignore已经替换为DoNotValidate: https://github.com/AutoMapper/AutoMapper/blob/master/docs/8.0-Upgrade-Guide.md

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

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/