348

私は Automapper を使用しており、次のようなシナリオがあります: クラス OrderModel には、データベースにない「ProductName」というプロパティがあります。だから私がマッピングをしようとすると:

Mapper.CreateMap<OrderModel, Orders>(); 

それは例外を生成します:

「Project.ViewModels.OrderModel の次の 1 つのプロパティがマップされていません: 'ProductName'

AutoMapper の Wiki for Projectionsで、反対のケースを読みました(追加の属性は、実際には私のケースであるソースではなく、宛先にあります)。

オートマッパーがこのプロパティのマッピングを行わないようにするにはどうすればよいですか?

4

9 に答える 9

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ますが、大量のラムダを使用するメソッドの外観は好きではありません。

于 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属性があります。これは、少し重い IMHO である流暢な構文ではなく、使用するつもりです。

于 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 に答える