8

動作していないか、動作していません...相互に継承する複数のビューにマップする単一のSourceクラスがあります。

基本的に、基本クラスはDetailであり、子クラスはEditまたはUpdateであり、Detailと同じデータに加えて、独自のリストなどを管理するための他のいくつかのフィールドを使用します。

これが私が使用しているマップです:

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>();

次に、MapFromを使用するプロパティのいずれかがMapper.Map(ticket)で評価されない場合、マッピングが設定されていない場合の値になります。

では、ここで何が問題になっていますか?

4

2 に答える 2

7

Mapper.Map2回電話をかけたくない場合の代替ソリューションとして。の一般的なマッピングをDetail拡張メソッドに移動できます。

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マッパーを登録するときに、その拡張メソッドを使用します。

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();

その後、通常どおりMapを使用できます。

Ticket ticket = new Ticket();    
var edit = Mapper.Map<Ticket, Edit>(ticket);
var update = Mapper.Map<Ticket, Update>(ticket); 
于 2012-01-15T12:43:05.970 に答える
5

Automapper 2.0のインクルード機能を正しく使用していますか?

いいえ-を使用する場合.Include、AutoMapperは、宛先クラスがソースクラスと同様の階層にあることを想定しています(これについては、ここで詳しく説明します)。つまり、Ticketto DetailUpdateおよびEdit、の異なるサブクラスにマッピングする場合はInclude適切です。

これはあなたの場合には役に立たないようです。.Mapのオーバーロードを使用して、既存のオブジェクトを取得して変更することをお勧めします。そうすれば、基本タイプのマッピングを定義するだけで済みます。

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.
于 2012-01-14T22:47:21.280 に答える