0

v4.2 から AutoMapper 5.1 にアップグレードしようとすると、実行時にコレクションがマッピングされないことがわかります。ソース オブジェクトにはコレクション内のアイテムがありますが、マッピングされた宛先プロパティは空です。

4.2 では、すべてが同じマッピング構成で期待どおりに機能しました (CreateMap() ctor の MemberList.None を保存します)。

私はそのようなDTOを持っています

public class GeographicEntity
{
 ...
}

public class County : GeographicEntity
{
    ...
}

public class State : GeographicEntity
{
    public List<County> Counties { get; } = new List<County>();
}

そして、そのようなビューモデル

public class GeographicEntityViewModel
{
  ...
}

public class CountyViewModel : GeographicEntityViewModel
{
  ...
}

public class StateViewModel : GeographicEntityViewModel
{
    public List<CountyViewModel> Counties { get; } = new List<CountyViewModel>();
}

そしてマッピング確認はこんな感じ

Mapper.Initialize(configuration =>
{
  configuration.CreateMap<GeographicEntity, GeographicEntityViewModel>(MemberList.None);

  configuration.CreateMap<County, CountyViewModel>(MemberList.None)
    .IncludeBase<GeographicEntity, GeographicEntityViewModel>();

  configuration.CreateMap<State, StateViewModel>(MemberList.None)
    .IncludeBase<GeographicEntity, GeographicEntityViewModel>();
});

Mapper.Map<> 呼び出しの後、ソース オブジェクトの .Counties コレクションにアイテムが含まれていても、StateViewModel の Counties コレクションは空 (0 アイテムのリスト) です。

var st = new State()
... (initialize the state, including the .Counties list)
var stateViewModel = Mapper.Map<StateViewModel>(st);

手がかりをいただければ幸いです。

4

1 に答える 1

0

掘り下げた結果、AutoMapper 5 のアップグレードによりいくつかの重大な変更が導入されたことが判明しました。具体的には、宛先コレクションにゲッターはあるがセッターがない私のようなケースで動作が変更されました。AutoMapper 4 では、デフォルトの動作は、新しいインスタンスを作成しようとするのではなく、デスティネーション プロパティをデフォルトで使用することでした。AutoMapper 5 は、デフォルトではそれを行いません。

解決策は、AutoMapper に宛先値を明示的に使用するように指示することです。

.ForMember(dest => dest.Counties, o => o.UseDestinationValue())

このような重大な変更を導入するのには十分な理由があると確信していますが、広範なパターンを実装し、この変更によって影響を受ける可能性のあるすべてのマップされたオブジェクトを探し出して修正する必要がある場合、心痛が尽きることはありません。

アップグレードをあきらめて Automapper 4.2 を使い続けたいという衝動に駆られます。これは、多くの余分で不必要な構成を必要とせずに、私が必要としていたことを正確に実行したからです。

詳細については、https://github.com/AutoMapper/AutoMapper/issues/1599を参照してください。

于 2016-11-14T20:57:56.110 に答える