2012-11-04 19 views
5

Ich habe this example on AutoMapper's GirHub gelesen, aber das Beispiel geht davon aus es nur ein Weg sein würde InnerSource auf der Karte, je:AutoMapper komplex verschachtelte Zuordnungen

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

Mit meinem Projekt, ich bin selbst erstellte Objekte mit EF Serialisierung, dass haben Zirkelbezüge. Der Grund dafür ist, dass ich an den Objekten aus verschiedenen Richtungen kommen muss. Wenn ich zum Beispiel nach einer Liste von Benutzern frage, möchte ich die Projekte sehen, denen sie zugeordnet sind. Wenn ich nach einem Projekt frage, möchte ich die mit diesem Projekt verbundenen Benutzer sehen.

Diese zirkulären Referenzen können ziemlich tief bekommen, wie User.Role.Project.TaskTime.User, User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User usw.

Also muß ich das verschachtelte Mapping ziemlich tief sein, und die Art, wie es gemacht wird, hängt von der ersten Abbildung war.

Derzeit mache ich:

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))); 
//... 

Die Viewmodels für das Snippet wie folgt aussehen:

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 
{ 
    //... 
} 

Ist das richtig? Soll ich jedes Mitglied aus dem Viewmodell projizieren und es per Projektion per Hand kartieren? Oder gibt es einen saubereren Weg, dies zu tun?

+0

Verwenden Sie Autoadapter, um Werte von ViewModel zu Ihren DB-Entities zuzuordnen? Ich rate dringend davon ab, AutoMapper für diese Zwecke nicht manuell zu verwenden. Andernfalls entstehen komplizierte Mapper-Profile, die immer dann fehlschlagen, wenn Sie neue Entitäten hinzufügen, die alte Mappings verwenden. –

Antwort

0

Sie können für jedes Mitglied eine nested Mapping-Projektion ausführen. Ähnliche Antwort habe ich gepostet here. Ich hoffe es hilft.

+0

In dieser Antwort geht es darum, verschachtelte Arrays zu verflachen - ich denke, er ist etwas nach http://Stackoverflow.com/questions/13337063/nested-mappings-with-instance-version-of-automapper, wo die Entitäten sich gegenseitig referenzieren. – Mightymuke

+0

Oh - ich habe gerade bemerkt, dass es das gleiche Poster ist :) – Mightymuke

+0

Ja, als ich diese andere Frage gestellt habe, habe ich die Instanzversion von AutoMapper herausgefunden, die das Problem, das ich hier hatte, ziemlich löst –