2012-06-17 11 views
11

In qualche modo il mio codice non funziona più (ha funzionato prima con lo stesso codice esatto). Questo è il problema:Un'eccezione di tipo "AutoMapper.AutoMapperMappingException" si è verificata in AutoMapper.dll ma non è stata gestita nel codice utente

Il codice

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

Configurazione:

Mapper.CreateMap<BookcaseItem, FoundBookcaseItemViewModel>() 
    .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<BookcaseItem> items = _bookcaseItemService.GetBookcaseItemsForUser(facebookId); 
    IEnumerable<FoundBookcaseItemViewModel> viewModels = items.Select(Mapper.Map<BookcaseItem, FoundBookcaseItemViewModel>); 

    return PartialView(viewModels); 
} 

L'errore

Il risultato è il seguente errore:

An exception of type 'AutoMapper.AutoMapperMappingException' occurred in AutoMapper.dll but was not handled in user code

I dati di debug

prima di tutto garantire che non vi 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:

Mapping types: BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB -> String System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB -> System.String

Destination path: FoundBookcaseItemViewModel.Authors

Source value: System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB

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

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

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

Oh, e, infine, c'è un'altra proprietà denominata 'contesto' con i seguenti dati:

enter image description here

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 (ho avuto 4.5, ma che ha causato troppi errori, così ho rotolato indietro con Git alla versione 4.0)
  • Entity Framework 5.0 RC
  • AutoMapper 2.1.267

L'entità e la ViewModel

Non so se è rilevante, ma qui è la classe di origine per la mappatura:

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 classe di destinazione per la mappatura:

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; } 
} 

risposta

4

sembra che ci sia un problema con la mappatura Autori prope rty. 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))) 
+0

Sembra che tu abbia trovato la radice del problema, buon signore. Ho aggiunto un controllo Null nel metodo MapFrom() e ora l'eccezione è scomparsa :) –

+0

@LeonCullens Dovresti aggiungere anche un controllo vuoto. –

+0

Bene, 'Authors' è una raccolta di stringhe, quindi devo solo controllare se la raccolta contiene più di 0 elementi (le stringhe nella raccolta non possono essere nulle o vuote, che è gestita altrove) :-) –

Problemi correlati