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:
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; }
}
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 :) –
@LeonCullens Powinieneś dodać także puste czek. –
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) :-) –