Un’eccezione di tipo “AutoMapper.AutoMapperMappingException” si è verificata in AutoMapper.dll ma non è stata gestita nel codice utente

In qualche modo il mio codice non funziona più (ha funzionato prima con lo stesso codice esatto). Questo è il problema:

Il codice

Sto cercando di mappare alcuni oggetti su ViewModels con questo codice:

Configurazione:

Mapper.CreateMap() .ForMember(x => x.Title, opt => opt.MapFrom(src => src.Book.Title)) .ForMember(x => x.Authors, opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j))) .ForMember(x => x.Identifiers, opt => opt.MapFrom(src => (!string.IsNullOrEmpty(src.Book.Isbn10) ? ("ISBN10: " + src.Book.Isbn10 + "\r\n") : string.Empty) + (!string.IsNullOrEmpty(src.Book.Isbn13) ? ("ISBN13: " + src.Book.Isbn13) : string.Empty))) .ForMember(x => x.Pages, opt => opt.MapFrom(src => src.Book.Pages)) .ForMember(x => x.ImageUri, opt => opt.MapFrom(src => src.Book.ThumbnailUriSmall)); 

L’utilizzo:

 public ActionResult Index() { string facebookId = _accountService.GetLoggedInUserFacebookId(); IEnumerable items = _bookcaseItemService.GetBookcaseItemsForUser(facebookId); IEnumerable viewModels = items.Select(Mapper.Map); return PartialView(viewModels); } 

L’errore

Ciò si traduce nel seguente errore:

Un’eccezione di tipo “AutoMapper.AutoMapperMappingException” si è verificata in AutoMapper.dll ma non è stata gestita nel codice utente

I dati di debug

Prima di tutto mi assicuro che non ci siano errori di configurazione chiamando:

 Mapper.AssertConfigurationIsValid(); 

Ho impostato punti di interruzione su tutto il mio codice e provo a eseguirne il debug, ma non riesco a capirlo. La raccolta ‘items’ è piena di dati (classi proxy generate da Entity Framework), ma la collezione ‘viewModels’ è piena di dati strani. Ha un “messaggio” che dice questo:

Tipi di mapping: BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB -> String System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB -> System.String

Percorso di destinazione: FoundBookcaseItemViewModel.Authors

Valore sorgente: System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB

E poi c’è una proprietà stacktrace che dice:

a System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext ()

a System.Linq.SystemCore_EnumerableDebugView`1.get_Items ()

Oh e finalmente c’è un’altra proprietà chiamata ‘contesto’ con i seguenti dati:

inserisci la descrizione dell'immagine qui

Qualcuno può spiegare cosa sta succedendo qui e perché il mio codice non funziona più? Di recente ho apportato un paio di modifiche alla mia soluzione, ma le ho rilasciate indietro da Git, quindi non dovrebbero avere alcun effetto sul codice.

La mia configurazione

  • Visual Studio 12 RC
  • ASP.NET MVC 4
  • .NET Framework 4.0 (avevo 4.5, ma questo ha causato troppi errori, quindi sono tornato con Git alla versione 4.0)
  • Entity Framework 5.0 RC
  • AutoMapper 2.1.267

L’entity framework e ViewModel

Non so se è rilevante, ma qui è la class sorgente per la mapping:

 public class BookcaseItem : Entity { public Guid Id { get; set; } public bool IsRenting { get; set; } public bool IsSwapping { get; set; } public bool IsSelling { get; set; } public decimal RentingPrice { get; set; } public decimal SellingPrice { get; set; } public string Currency { get; set; } public bool IsAvailable { get; set; } public virtual Guid BookId { get; set; } public virtual Guid UserId { get; set; } public virtual Book Book { get; set; } public virtual User User { get; set; } public BookcaseItem() { IsAvailable = true; Currency = "USD"; } } 

E questa è la class di destinazione per la mapping:

 public class FoundBookcaseItemViewModel { public Guid Id { get; set; } public bool IsRenting { get; set; } public bool IsSwapping { get; set; } public bool IsSelling { get; set; } public decimal RentingPrice { get; set; } public decimal SellingPrice { get; set; } public string Title { get; set; } public string Authors { get; set; } public string Identifiers { get; set; } public int Pages { get; set; } public string ImageUri { get; set; } } 

Sembra che ci sia un problema con la mapping della proprietà Authors. Questa chiamata aggregata genererà un’eccezione se la sequenza Autori è nulla o vuota.

 .ForMember(x => x.Authors, opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))