2012-08-02 13 views
5

Ich versuche, Entitäten in einer Sammlung durch eine viele bis viele Tabelle mithilfe von AutoMapper abzubilden.AutoMapper viele zu viele Beziehung in Sammlung

Mein Domain-Modell (Entity Framework) sieht wie folgt aus:

public class User 
{ 
    public int UserID { get; set; } 
    public string Name { get; set; }   
    public IList<UserCompany> UserCompanies { get; set; } 
} 

public class Company 
{ 
    public int CompanyID { get; set; } 
    public string Name { get; set; } 
} 

public class UserCompany 
{ 
    public int UserCompanyID { get; set; } 
    public int UserID { get; set; } 
    public int CompanyID { get; set; } 
} 

Ich versuche, zu einer Klasse zuzuordnen, die wie folgt aussieht:

public class CompanyDTO 
{ 
    public int CompanyID { get; set; } 
    public string Name { get; set; } 
} 

public class UserDTO 
{ 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public IList<CompanyDTO> Companies { get; set; } 
} 

Meine aktuelle Mapping-Konfiguration wie folgt aussieht :

Bestätigen, dass die Konfiguration gültig ist, gibt True zurück, aber wenn ich versuche, zu aktivieren Wenn ich einen User mit einem UserDTO abbilde, bekomme ich: Die Signatur des Body und die Deklaration in einer Methodenimplementierung stimmen nicht überein.

Wenn ich AfterMap verwende und jedes Unternehmen manuell in die Firmenliste verschiebe, wird es funktionieren, aber es scheint, als ob ich in der Lage sein sollte, dies innerhalb der create map zu handhaben.

In meiner Abfrage, um einen einzelnen Benutzer aus der Datenbank zu erhalten, ich bin die Benutzereigenschaft UserCompany.Company enthalten und ich kann Quickwatch und sehen, dass es zurückgegeben wird.

Antwort

6

Sie brauchen die explizite Zuordnung nicht in Ihrer Zuordnungskonfiguration. Sie sollten so etwas wie der Lage zu tun:

Mapper.CreateMap<User, UserDTO>() 
    .ForMember(dto => dto.Companies, opt => opt.MapFrom(x => x.UserCompanies)); 

Sie auch eine Zuordnung für Usercompany definieren müssen:

Mapper.CreateMap<UserCompany, CompanyDTO>(); 

Beachten Sie, dass Sie eine CompanyDTO Klasse nicht in Ihre Beispiele haben so ich kann die tatsächliche Mapping-Konfiguration nicht ermitteln.

aktualisieren

Ich nehme an, es ist ein Grund, warum Sie eine IList in Ihrer Benutzer-Einheit benötigen, anstatt einfach eine IList. Da, ich glaube, Sie brauchen eine benutzerdefinierte Resolver: https://github.com/AutoMapper/AutoMapper/wiki/Custom-value-resolvers

Update 2

Ich bin froh, Sie haben es sortiert. Der Vollständigkeit halber wird das Beispiel erläutert, wenn Sie sich dazu entschließen, einen benutzerdefinierten ValueResolver mit den oben genannten Klassen zu verwenden.

Mapper.CreateMap<Company, CompanyDTO>(); 
Mapper.CreateMap<User, UserDTO>() 
    .ForMember(dto => dto.Companies, opt => opt.ResolveUsing<CompanyResolver>()); 
Mapper.AssertConfigurationIsValid(); 

Wo CompanyResolver ist so etwas wie

public class CompanyResolver : ValueResolver<User, IList<CompanyDTO>> 
{ 
    protected override IList<CompanyDTO> ResolveCore(User source) 
    { 
     return source.UserCompanies 
      .Select(userCompany => 
        Mapper.Map<Company, CompanyDTO>(companies.FirstOrDefault(x => x.CompanyID == userCompany.CompanyID))) 
      .ToList(); 
    } 
} 
+0

Ich habe versucht, was Sie vorgeschlagen, aber das Ergebnis war das gleiche. UserCompany ist eine Entität, die Benutzer und Unternehmen verbindet. Um UserCompany dem Unternehmen zuzuordnen, musste ich also jedes Feld explizit zuordnen, z. B. Mapper.CreateMap () .Formember (dto => dto.Name, opt => opt.MapFrom (x => x.Company.Name); Zusätzlich versuchte ich, meine Linienzuordnung der IList von Company-Objekten zu entfernen, und ich sehe immer noch den gleichen Fehler –

+0

Zusätzlich versuchte, mein MapTo zu diesem zu wechseln : .ForMember (dto => dto.Companies, opt => opt.MapFrom (x => x.UserCompanies)), gleicher Fehler –

+0

Mighty, ich habe es herausgefunden.Ich dachte nicht, dass es erwähnenswert ist, aber die Dto-Objekte, denen ich zugeordnet habe, waren Interfacetypen. Der Fehler trat auf, als AutoMapper versuchte, ein Proxy-Objekt dafür zu erstellen. Mein ursprünglicher Mapping-Code funktionierte einwandfrei, mit dem Hinzufügen dieser Zeile zum Mapping-Setup. .ConstructUsing ((Func ) (x => neues UserDTO())) Danke für Ihre Hilfe! –