2012-11-04 26 views
5

che ho letto this example on AutoMapper's GirHub, ma l'esempio presuppone ci sarà solo un modo per mappare InnerSource, mai:automapper complesse mappature nidificate

Mapper.CreateMap<OuterSource, OuterDest>(); 
Mapper.CreateMap<InnerSource, InnerDest>(); 
Mapper.AssertConfigurationIsValid(); 

var source = new OuterSource 
    { 
     Value = 5, 
     Inner = new InnerSource {OtherValue = 15} 
    }; 

var dest = Mapper.Map<OuterSource, OuterDest>(source); 

con il mio progetto, sto serializzazione di oggetti creati con EF che avere riferimenti circolari. La ragione di questo è che avrò bisogno di venire agli oggetti da diverse 'direzioni'. Ad esempio, se chiedo un elenco di utenti, voglio vedere i progetti a cui sono associati. Se chiedo un progetto, voglio vedere gli utenti associati a quel progetto.

Questi riferimenti circolari possono ottenere abbastanza profonda, come User.Role.Project.TaskTime.User, User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User, ecc

Quindi ho bisogno la mappatura nidificato per essere abbastanza profonda, e il modo in cui è fatto dipende da ciò che la prima mappatura era.

Attualmente sto facendo:

Mapper.CreateMap<User, UserFull>() 
    .ForMember("TaskTimes", opt => opt.MapFrom(src => Mapper.Map<ICollection<TaskTime>, UserTaskTime>(src.TaskTimes))); 
Mapper.CreateMap<TaskTime, UserTaskTime>() 
    .ForMember("Task", opt => opt.MapFrom(src => Mapper.Map<Task, UserTaskTimeTask>(src.Task))); 
//... 

Le ViewModels per quel frammento di simile a questa:

public class UserFull 
{ 
    public string Email { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<TaskTime> TaskTimes { get; set; } 
    //... 
} 

public class UserTaskTime 
{ 
    public int Id { get; set; } 
    public Task Task { get; set; } 
    //... 
} 

public class UserTaskTimeTask 
{ 
    //... 
} 

è questo diritto? Dovrei proiettare ogni membro dal viewmodel e mapparlo a mano usando la proiezione? O c'è un modo più pulito per fare questo?

+0

Stai utilizzando la funzione di automapp per mappare i valori da ViewModel alle entità DB? Consiglio vivamente di non usare AutoMapper per questi scopi e di farlo manualmente, altrimenti finirai con profili di mapper complicati che continueranno a fallire se aggiungi nuove entità che usano quelli vecchi per la mappatura. –

risposta

0

È possibile eseguire la mappatura nidificata che proietta su ciascun membro. Risposta simile che ho pubblicato here. Spero che sia d'aiuto.

+0

Questa risposta riguarda l'appiattimento di array nidificati - Penso che stia cercando qualcosa di più simile a http://stackoverflow.com/questions/13337063/nested-mappings-with-instance-version-of-automapper in cui le entità si richiamano a vicenda. – Mightymuke

+0

Oh, ho appena notato che è lo stesso poster :) – Mightymuke

+0

Sì, nel momento in cui ho chiesto a quell'altra domanda che avevo capito usando la versione di istanza di AutoMapper, che praticamente risolve il problema che stavo avendo qui –