2012-06-17 11 views
11

Jakoś mój kod już nie działa (działało wcześniej z tym samym kodem). To jest problem:Wyjątek typu "AutoMapper.AutoMapperMappingException" wystąpił w AutoMapper.dll, ale nie był obsługiwany w kodzie użytkownika

Kod

Usiłuję mapować kilka obiektów do ViewModels z tym kodem:

Konfiguracja:

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

Wykorzystanie:

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

Błąd

Wynika to w następujący błąd:

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

Dane debugowania

Przede wszystkim upewnić się, że nie ma żadnych błędów konfiguracyjnych poprzez wywołanie:

Mapper.AssertConfigurationIsValid(); 

Ustawiłem breakpointy na całym moim kodzie i próbowałem go debugować, ale nie mogę tego zrozumieć. Kolekcja "items" jest wypełniona danymi (klasami proxy generowanymi przez Entity Framework), ale kolekcja "viewModels" jest wypełniona dziwnymi danymi. To ma „wiadomość”, który mówi to:

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

A potem jest właściwością StackTrace który mówi:

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

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

Oh i wreszcie kolejna właściwość o nazwie „kontekst” z następującymi danymi:

enter image description here

Może ktoś wyjaśnić, co tu się dzieje i dlaczego mój kod nie działa dłużej? Niedawno wprowadziłem kilka zmian do mojego rozwiązania, ale wycofałem je z powrotem przez Git, więc nie powinny one mieć żadnego wpływu na kod.

Moja konfiguracja

  • Visual Studio 12 RC
  • ASP.NET MVC 4
  • .NET Framework 4.0 (miałem 4.5 ale to spowodowane zbyt wiele błędów, więc wycofana z Git do wersji 4.0)
  • Entity Framework 5.0 RC
  • AutoMapper 2.1.267

Żywa i ViewModel

Nie wiem, czy to istotne, ale tutaj jest klasa źródło dla mapowania:

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

I to jest klasa miejscem mapowanie:

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

Odpowiedz

4

Wygląda na to, że jest problem z mapowaniem Authors prope rty. To połączenie Aggregate wygeneruje wyjątek, jeśli sekwencja Authors ma wartość NULL lub jest pusta.

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

Wygląda na to, że udało Ci się znaleźć źródło problemu, proszę pana. Dodałem zerową kontrolę w metodzie MapFrom(), a teraz wyjątek już nie istnieje :) –

+0

@LeonCullens Powinieneś dodać także puste czek. –

+0

No cóż, "Autorzy" to zbiór ciągów znaków, więc sprawdzam tylko, czy zbiór zawiera więcej niż 0 elementów (ciągi w kolekcji nie mogą być puste lub puste, to jest obsługiwane w innym miejscu) :-) –

Powiązane problemy