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?
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. –