2012-01-14 8 views
8

私はそうではない、または動作していません...私は、互いに継承する複数のビューにマップする単一のSourceクラスを持っています。Automapper 2.0のインクルード機能を正しく使用していますか?

基本的に基本クラスは詳細で、子クラスは詳細またはすべての同じデータを使用する編集または更新であり、その他のいくつかのフィールドで独自のリストなどを管理します。 MapFromを使用するプロパティのいずれかに評価されませんI Mapper.Map(チケット)を、彼らはちょうど彼らの値で終わる場合

Mapper.CreateMap<Ticket, Detail>() 
       .Include<Ticket, Update>() 
       .Include<Ticket, Edit>() 
       .ForMember(dest => dest.Priority, opt => opt.MapFrom(src => src.Priority.Code)) 
       .ForMember(dest => dest.TicketID, opt => opt.MapFrom(src => src.ID)) 
       .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusCode)) 
       .ForMember(dest => dest.Category, opt => opt.MapFrom(src => src.ProblemCategoryCode)) 
       .ForMember(dest => dest.crmBusCode, opt => opt.MapFrom(src => src.Company.crmBusCode)) 
       .ForMember(dest => dest.TeamMembers, opt => opt.MapFrom(src => src.Schedules.Where(s => s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Update>() 
       .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules.Where(s => s.EmployeeID == Util.CurrentUserID() && s.CompleteTime == null))); 

      Mapper.CreateMap<Ticket, Edit>(); 

を次に:ここ

は、私が使用しているマップがあります設定されたマッピングがない場合は、持っていました。

ここで何が問題なのですか?

+0

どのAutomapperのバージョンを使用していますか? – nemesv

+0

私はバージョン2.0を使用しています – CodeRedick

答えて

7

:その方法は、あなただけの基本型のマッピングを定義する必要があります。

public static class MappingExtensions 
{ 
    public static IMappingExpression<Ticket, TDest> MapDetailProperties<TDest>(
     this IMappingExpression<Ticket, TDest> mapBase) where TDest : Detail 
    { 
     return mapBase 
      .ForMember(dest => dest.Priority, 
       opt => opt.MapFrom(src => src.Priority.Code)) 
      ///.... 
      .ForMember(dest => dest.TeamMembers, 
       opt => opt.MapFrom(src => src 
        .Schedules.Where(s => s.CompleteTime == null))); 
    } 
} 

をそしてTicket -> UpdateTicket -> Editマッパーを登録するときに、その拡張メソッドを使用します:あなたは、拡張メソッドにDetailの共通マッピングを移動することができます

Mapper.CreateMap<Ticket, Update>() 
    .MapDetailProperties() 
    .ForMember(m => m.Schedules, opt => opt.MapFrom(t => t.Schedules 
     .Where(s => s.EmployeeID == Util.CurrentUserID() && 
      s.CompleteTime == null))); 

Mapper.CreateMap<Ticket, Edit>() 
    .MapDetailProperties(); 

次にあなたが正常に地図を使用することができます。

Ticket ticket = new Ticket();  
var edit = Mapper.Map<Ticket, Edit>(ticket); 
var update = Mapper.Map<Ticket, Update>(ticket); 
+1

もう少し仕事がありますが、間違いなく正しい方法だと思われます!この拡張メソッドのように基本的に動作するためにインクルードが意味をなさないと思うのは私だけですか? – CodeRedick

+0

私の似たような問題に対する解決策はこれとは少し異なりましたが、静的な拡張メソッドのコアコンセプトを使用しています。私はAutoMapperがこれをサポートしてくれることを願っています。 –

5

Automapper 2.0のInclude機能を正しく使用していますか?

いいえ - あなたは.Includeを使用する場合、AutoMapper宛先クラスはソースクラス(これはさらにhere議論される)と同様の階層であることを期待しません。つまり、TicketDetailの異なるサブクラスにマッピングする場合は、UpdateEditの場合、Includeが適切です。

これはあなたのケースでは役に立たないと思われます。私は.Mapのオーバーロードを使用することをお勧めします。これは既存のオブジェクトを受け取り、変更します。あなたはMapper.Map 2回呼び出すにしたくない場合は、代替策として

Ticket ticket = new Ticket(); 
Edit edit = new Edit(); 

Mapper.Map<Ticket, Detail>(ticket, edit); 
// Edit has now been automapped using the base mapping. 

Mapper.Map<Ticket, Edit>(ticket, edit); 
// The properties unique to Edit have now been mapped.