2013-11-21 1 views
5

私が持っていたマッピング設定TMyRowの1つのコピーを除いてすべてのプロパティは、自動プロパティです。AutoMapper強く型付けされたデータは次のように定義された

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")] 
public string PositionFolder{ 
    get { 
     try { 
      return ((string)(this[this.tableTMyDataSet.PositionFolderColumn])); 
     } 
     catch (global::System.InvalidCastException e) { 
      throw new global::System.Data.StrongTypingException("The value for column \'PositionFolder\' in table \'TMyDataSet\' is DBNull.", e); 
     } 
    } 
    set { 
     this[this.tableTMyDataSet.PositionFolderColumn] = value; 
    } 
} 

私が呼ぶ:

DsMyDataSet.TMyRow row = ....; 
AutoMapper.Mapper.Map<MyRowDto>(row); 

列の値がnullであるので、私はStrongTypingException例外を取得します。このプロパティはnull可能ですが、厳密に型指定されたデータセットはnull可能なプロパティをサポートしていないため、IsNullableインスタンスを呼び出す必要があります。 マッピングを処理する(エラーを無視してヌル値を残す)ように、AutoMapperでこの問題を回避するにはどうすればよいですか?

答えて

2

私はこの問題を解決するための最も簡単な方法は、IMemberConfigurationExpression<DsMyDataSet.TMyRow>.Condition()メソッドを使用してソース値にアクセスするStrongTypingExceptionを投げるかどうかをチェックするためにtry-catchブロックを使用することだと思います。ここで

は、あなたのコードは次のよう探して終わるだろうかです:

Mapper.CreateMap<DsMyDataSet.TMyRow, MyRowDto>() 
     .ForMember(target => target.PositionFolder, 
     options => options.Condition(source => { 
      try { return source.PositionFolder == source.PositionFolder; } 
      catch(StrongTypingException) { return false; } 
     }); 

これは一般的な出来事であるならば、あなたは、各メンバーのためにすべてこのコードを書く避けるために、いくつかの他のオプションを持っています。

public static class AutoMapperSafeMemberAccessExtension 
{ 
    public static void IfSafeAgainst<T,TException>(this IMemberConfigurationExpression<T> options, Func<T,object> get) 
     where TException : Exception 
    { 
     return options.Condition(source => { 
      try { var value = get(source); return true; } 
      catch(TException) { return false; } 
     }); 
    } 
} 

AutoMapperはまた、いくつかの拡張ポイントが組み込まれていますここにも活用することができます。以下は、溶液中にあるとき

Mapper 
.CreateMap<Row,RowDto>() 
.ForMember(target => target.PositionFolder, options => options.IfSafeAgainst<Row,StrongTypingException>(source => source.PositionFolder)) 

一つの方法は、拡張メソッドを使用することです。私に飛び出すカップルの可能性がある:

  1. は、カスタムIValueResolver実装を定義します。既に使用可能なソリューションには、NullReferenceExceptionSwallowingResolverという同様の実装があります。あなたはおそらくそのコードをコピーし、あなたがどのような種類の例外を指定しているかを指定する部分を変更するだけです。

    Mapper.CreateMap<Row,RowDto>() 
        .ForMember(target => target.PositionFolder, 
         options => options.ResolveUsing<ExceptionSwallowingValueResolver<StrongTypingException>>()); 
    
Documentation for configuration is on the AutoMapper wikiが、構成コードは次のようになります
2

は、このマッピングを使用します。

Mapper.CreateMap<DsMyDataSet.TMyRow, MyRowDto>() 
    .ForMember(s => s.PositionFolder, o => o.MapFrom(d => !d.IsPositionFolderNull() ? d.PositionFolder: null)); 
関連する問題