2016-05-10 9 views
2

Ich habe Entität Request und Modell RequestModelAutoMapper .ForMember abhol

public class RequestModel : BaseModel 
{ 
    public IEnumerable <int> Recipients { get; set; } 
} 

public class Request : IIdent 
{ 
    public virtual ICollection <RequestComment> Comments { get; set; } 
} 

public class RequestComment : IIdent 
{ 
    [ForeignKey("User")] 
    public int? UserId { get; set; } 
} 

I-Mapping wollen für Recipients

CreateMap<Request, RequestModel>() 
     .ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments.Select(x => x.UserId))) 

schaffen, aber ich Ausnahme:

AutoMapper.AutoMapperMappingException wurde abgefangen _HResult = -2146233088 HResult = -2146233088 IsTransient = false Message = Mapping-Typen: Request -> IEnumerable 1 AttManager.Data.Request -> System.Collections.Generic.IEnumerable 1 [[System.Int32 Mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] Pfad Reiseziel: RequestModel.Recipients.Recipients Quelle Wert:

AttManager.Data.Request

Antwort

2

Das Problem kommt, wenn Sie versuchen, eine IEnumerable<RequestComment>-IEnumerable<int> zu konvertieren, so AutoMapper wird versuchen, eine Umwandlung zwischen RequestComment zu int zu finden, aber nicht definiert ist.

Sie die Konvertierung von RequestComment zu int wie folgt definieren:

.CreateMap<RequestComment, int>().ConvertUsing(rm => rm.UserId ?? 0); 

Und die Karte zwischen den Anfragen Modelle:

.CreateMap<Request, RequestModel>() 
.ForMember(d => d.Recipients, o => o.MapFrom(s => s.Comments)) 

Auch eine andere Art und Weise, Ihr Problem zu lösen, ist die Definition eines AfterMap Betrieb:

.CreateMap<Request, RequestModel>() 
.AfterMap((r, rm) => rm.Recipients = new List<int>(r.Comments.Select(c => c.UserId ?? 0))); 

Ich füge einfach ?? 0 hinzu, weil UserId der Typ int? ist, also muss für Recipients Eigentum in int umgewandelt werden.

+0

Danke! Der erste Weg funktioniert gut, aber mit 2. Ich habe einige Probleme .. Ich bekomme auch eine Ausnahme in der Zuordnung. Soll ich Code wie '.ForMember (d => d.Recipients, o => o.PreserveAndIgnore())' vor der Verwendung von '.AfterMap()'? – demo

+0

@demo: Ich habe gerade In-Memory mit einzelnen Karten getestet, aber wenn Sie abfragbare Projektionen verwenden, ist 'AfterMap' keine Option, sorry dafür. –