2013-06-09 7 views
5

Ho visto molti esempi di questo errore, per una vasta gamma di cause e ho esaminato tutte le cause che riesco a vedere, ma continuo a ottenere l'errore, quindi mi chiedo se qualcuno possa dare qualche informazione su cosa significhi effettivamente questo errore, quindi posso provare a trovare la causa. Ecco il codice:Come eseguire il debug di AutoMapper "Configurazione della mappa di tipo mancante o mapping non supportato" errore

Controller:

[HttpPost] 
    public ActionResult Edit(ProfileViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var person = new UserAttribute(); 

      person = Mapper.Map<ProfileViewModel, UserAttribute>(model); 

      db.UserAttribute.Add(person); 
      db.SaveChanges(); 

     } 

View Modello

public class ProfileViewModel 
{ 

    [Display(Name = "First Name")] 
    [StringLength(20)] 
    [Required] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [StringLength(30)] 
    [Required] 
    public string LastName { get; set; } 

    [Display(Name = "Gender")] 
    [Required] 
    public string Gender { get; set; } 

    [Display(Name = "Date of Birth")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime DOB { get; set; } 

    [Display(Name = "Hair Color")] 
    public string HairColor { get; set; } 

    [Display(Name = "Eye Color")] 
    public string EyeColor { get; set; } 

    [Display(Name = "Body Type")] 
    public string Weight { get; set; } 

    [Display(Name = "Height")] 
    public string HeightFeet { get; set; } 

    public string HeightInches { get; set; } 

    public int UserId { get; set; } 

    public IEnumerable<SelectListItem> WeightList { get; set; } 
    public IEnumerable<SelectListItem> EyeColorList { get; set; } 
    public IEnumerable<SelectListItem> HairColorList { get; set; } 
    public IEnumerable<SelectListItem> HeightFeetList { get; set; } 
    public IEnumerable<SelectListItem> HeightInchesList { get; set; } 
    public IEnumerable<SelectListItem> GenderList { get; set; } 

} 

modello UserAttribute:

public int ProfileId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Gender { get; set; } 
    public System.DateTime DOB { get; set; } 
    public string HairColor { get; set; } 
    public string EyeColor { get; set; } 
    public string HeightFeet { get; set; } 
    public string Weight { get; set; } 
    public int UserId { get; set; } 
    public string HeightInches { get; set; } 

Mapping config:

public class AutoMapperConfiguration 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(x => x.AddProfile<ViewToDomainMapProfile>()); 
     Mapper.Initialize(x => x.AddProfile<DomainToViewMapProfile>()); 
    } 
} 

public class ViewToDomainMapProfile : Profile 
{ 
    public override string ProfileName 
    { 
     get { return "ViewToDomainMapProfile"; } 
    } 

    protected override void Configure() 
    { 
     Mapper.CreateMap<ProfileViewModel, UserAttribute>() 
      .ForSourceMember(x => x.GenderList, y => y.Ignore()) 
      .ForSourceMember(x => x.HairColorList, y => y.Ignore()) 
      .ForSourceMember(x => x.EyeColorList, y => y.Ignore()) 
      .ForSourceMember(x => x.WeightList, y => y.Ignore()) 
      .ForSourceMember(x => x.HeightFeetList, y => y.Ignore()) 
      .ForSourceMember(x => x.HeightInchesList, y => y.Ignore()); 
    } 
} 

e la configurazione viene chiamato nel ASax globale:

 AutoMapperConfiguration.Configure(); 
+0

si tratta di un errore di compilazione o di runtime? inoltre, il dominio per il mapping viewmodel funziona correttamente? – user1778606

risposta

0

Per il ViewModel => userattribute

ho notato che ProfileId è una proprietà di destinazione, ma non una proprietà source.

public int ProfileId { get; set; } 

Hai bisogno di aggiungere codice per ingaggiare questo membro di destinazione?

Altro: Si potrebbe anche suggerire di utilizzare o personalizzare l'automapper per mappare le proprietà che presentano che corrispondono per nome esclusivamente.

Inoltre, quando possibile, si prega di evitare i nomi dei modelli che terminano con la parola Attrito come per convenzione questo è usato quasi esclusivamente per gli attributi attuali. (le mie scuse per fare i difficili)

10

Uso Mapper.AssertConfigurationIsValid(); produce la seguente eccezione:

AutoMapper.AutoMapperConfigurationException : 
Unmapped members were found. Review the types and members below. 
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type 
============================================================================================== 
ProfileViewModel -> UserAttribute (Destination member list) 
---------------------------------------------------------------------------------------------- 
ProfileId 

Quindi, è necessario aggiungere mappatura per ProfileId.

In generale, è una buona pratica utilizzare Mapper.AssertConfigurationIsValid(); nei test di unità (li hai, giusto?) O dopo la configurazione del tuo mapper. Visualizzerà informazioni dettagliate per tali errori di configurazione.

+0

Questo mi ha salvato. È sufficiente aggiungere Mapper.AssertConfigurationIsValid(); nelle mie mappature global.asax fammi vedere che la mia mappatura stava usando una classe diversa con lo stesso nome. (ignora che non è una buona pratica, è un codice legacy) Non mi ero reso conto che Mapper.Map() non lanciava un errore se non riusciva a trovare i mapping per tutti i membri. Non riesce proprio quando tenta di mappare. –

+0

qualcuno dovrebbe accettare questa risposta –