2011-02-08 8 views
11

Ho qualcosa di simileCome Automap questo (mappatura membri sub)

public class ProductViewModel 
{ 
    public int SelectedProductId { get; set; } 
    public string ProductName {get; set;} 
    public int Qty {get; set;} 
    public List<SelectListItem> Products { get; set}; 
} 

Ho un dominio come questo

public class Product 
{ 
    public int ProductId {get; set;} 
    public string ProductName {get; set;} 
    public int Qty {get; set;} 
} 


public class Store 
{ 
    public Product() {get; set;} 
} 

Ora ho bisogno di fare la mappatura.

// nel mio controller

var result = Mapper.Map<ProductViewModel, Store>(Product); 

questo non legare nulla dal momento che non riesce a capire come mettere il ProductId in quanto è

Store.Product.ProductId; 

La mia mappa è come questo

Mapper.CreateMap<ProductViewModel, Store>().ForMember(dest => dest.Product.ProductId, opt => opt.MapFrom(src => src.SelectedProductId)); 

ottengo questo errore

Espressione 'dest => Convert (dest.Product.SelectedProductId' must volontà di membro di primo livello. Parametro nome: lambdaExpression

Non so come procedere.

+0

Puoi correggere il tuo codice? Hai un sacco di errori lì dentro. Ad esempio, 'publicTM MyTest()' non è una dichiarazione di classe valida, e 'public MyTest() {get; set;} 'non è una dichiarazione di proprietà valida. –

+0

Stai intenzionalmente mappando dal tuo modello di vista alla tua classe di dominio? Questo non è raccomandato dai ragazzi degli automapper. –

+2

@Brian - Ya. Perchè no? Voglio dire, ho pensato che è l'intero punto di auto mapper. Altrimenti devo fare tutte le cose a mano sconfiggendo lo scopo del mappatore automatico. Quindi potrei anche solo mappare il dominio per visualizzare il modello a mano. – chobo2

risposta

1

L'errore che si ottiene è perché non è possibile dichiarare dichiarazioni di mappatura più di un livello nel grafico dell'oggetto.

Perché hai pubblicato solo una proprietà è difficile per me darti i codici che faranno funzionare. Un'opzione è quella di modificare la proprietà viewmodel su MyTestTestId e le convenzioni verranno automaticamente rilevate.

+0

Ho aggiunto altre proprietà. – chobo2

+0

un'altra cosa ho cambiato la mia roba in giro per cercare di farla riprendere dalle convenzioni ma non funziona. Ho cambiato SelectedProductId in ProductId e ProductId (nel mio dominio) su Id. Ancora non si lega. – chobo2

+0

La risposta dei duyker funziona –

25

Per mappare strutture nidificate, è sufficiente creare un nuovo oggetto nell'argomento MapFrom.

Esempio

Mapping:

Mapper.CreateMap<Source, Destination>() 
     .ForMember(d => d.MyNestedType, o => o.MapFrom(t => new NestedType { Id = t.Id })); 
Mapper.AssertConfigurationIsValid(); 

codice di prova:

var source = new Source { Id = 5 }; 
var destination = Mapper.Map<Source, Destination>(source); 

Classi:

public class Source 
{ 
    public int Id { get; set; } 
} 

public class Destination 
{ 
    public NestedType MyNestedType { get; set; } 
} 

public class NestedType 
{ 
    public int Id { get; set; } 
} 
2

È ca n usare Resolver.

creare una classe resolver del genere:

class StoreResolver : ValueResolver<Store, int> 
{ 
    protected override int ResolveCore(Store store) 
    { 
     return store.Product.ProductId; 
    } 
} 

e utilizzarlo così:

Mapper.CreateMap<ProductViewModel, Store>() 
     .ForMember(dest => dest.SelectedProductId, opt => opt.ResolveUsing<StoreResolver >()); 

auguro che possa aiutare ...

0

La risposta corretta data dal allrameest su questa questione dovrebbe aiutare: AutoMapper - Deep level mapping

Questo è quello che vi serve:

Mapper.CreateMap<ProductViewModel, Store>() 
    .ForMember(dest => dest.Product, opt => opt.MapFrom(src => src)); 
Mapper.CreateMap<ProductviewModel, Product>() 
    .ForMember(dest => dest.ProductId, opt => opt.MapFrom(src => src.SelectedProductId)); 

NOTA: Si dovrebbe cercare di allontanarsi da utilizzando Mapper.CreateMap a questo punto , è obsoleto e non sarà presto supportato.