web-dev-qa-db-ja.com

Automapperで一つのプロパティのマッピングを無視する

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

Mapper.CreateMap<OrderModel, Orders>(); 

例外が発生します。

"Project.ViewModels.OrderModelの次の1つのプロパティはマッピングされていません: 'ProductName'

私は AutoMapperのWiki for Projection で反対のケースを読みました(追加の属性は目的地にあります。実際には私の場合であるソースにはありません)。

どのように私はこのプロパティのマッピングをするようにautomapperを避けることができますか?

249
Msam85

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

それは 彼のブログのコメントの1つ にあります。

405
smartcaveman

私は多分完璧主義者です。私は本当に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で動作するように書き直すこともできますが、たくさんのラムダを持つメソッドの外観は嫌です。

222
Steve Rukuts

あなたはこれを行うことができます:

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

これを自動的にやろうとしている人なら誰でも、その拡張メソッドを使って目的の型に存在しないプロパティを無視することができます。

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/

28
Stéphane

今は(AutoMapper 2.0)IgnoreMap属性があります。これは、ちょっと重いIMHOである流暢な構文ではなく、使用するつもりです。

28
Guillaume

ビューモデルをドメインモデルにマッピングしなおすときは、デスティネーションメンバーリストではなくソースメンバーリストを単純に検証する方がはるかにきれいです。

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

これで、マッピングの検証が失敗することはなく、ドメインクラスにプロパティを追加するたびにIgnore()が必要になります。

19
Loren Paulsen