3

これらのマッピングがあると仮定しましょう:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

Dtos の継承:

DetailDto : BaseDto

UpdateDto : BaseDto

最初のマッピングを mapping2 と mapping3 にマージ/結合する方法はありますか?

このようなもの:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .Import(mapping1);
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .Import(mapping1);
    .ForMember(o => o.Temp, m => m.Ignore());

以下.Includeが機能しないため、関数は私が望むことをしていないようです:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .Include<Order, DetailDto>()
    .Include<Order, UpdateDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());

var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());

var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

更新:より具体的になるように質問を編集しました

4

2 に答える 2

0

バグかしら。ドキュメントには次のように記載されています。

AutoMapper 2.0では、これは次のようになります。

Mapper.CreateMap<Order, OrderDto>()
  .Include<OnlineOrder, OnlineOrderDto>()
  .Include<MailOrder, MailOrderDto>()
  .ForMember(o=>o.Id, m=>m.MapFrom(s=>s.OrderId));
Mapper.CreateMap<OnlineOrder, OnlineOrderDto>();
Mapper.CreateMap<MailOrder, MailOrderDto>();

基本クラスのマッピングを定義したので、子マッピングでそれを定義する必要はありません。

にアップグレードしたばかりでAutoMapper 2.2.1-ci9000、あなたと同じ動作をしています(つまり、Referrer無視されていません)。

問題を作成して、彼らの言うことを確認することをお勧めします。

于 2013-01-05T06:52:50.390 に答える
0

これは少し遅れていることは承知していますが、同様の問題を抱えている他の誰かのために...

AutoMapper Github wiki でこのページを見つけるまで、同じ問題に苦労しました。

要約すれば:

継承された構成は、優先順位に照らして評価されます (複数のマップが同じメンバーに対して競合する構成を持つ問題を解決するため)。継承されたIgnore()は、AutoMapper の標準的な規則ベースのマッピングよりも優先度が低くなります。そのため、ソース タイプと宛先タイプの両方にReferrerプロパティがある場合、ほとんどの派生タイプの規則ベースのマッピングは、継承された をオーバーライドしますIgnore()

つまり、この場合、Ignore()派生した型ごとにマップを繰り返す必要があることを示唆していますBastDto

于 2014-07-23T14:06:12.903 に答える