Исключение типа "AutoMapper.AutoMapperMappingException" возникло в AutoMapper.dll, но не было обработано в коде пользователя
Почему-то мой код больше не работает (раньше он работал с точно таким же кодом). Это проблема:
Код
Я пытаюсь сопоставить некоторые объекты ViewModels с этим кодом:
Конфигурация:
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));
Использование:
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);
}
Ошибка
Это приводит к следующей ошибке:
Исключение типа "AutoMapper.AutoMapperMappingException" возникло в AutoMapper.dll, но не было обработано в коде пользователя
Данные отладки
Прежде всего я гарантирую, что нет ошибок конфигурации, вызывая:
Mapper.AssertConfigurationIsValid();
Я установил точки останова во всем своем коде и попытался отладить его, но я не могу понять это. Коллекция 'items' заполнена данными (прокси-классы, сгенерированные Entity Framework), но коллекция 'viewModels' заполнена странными данными. У него есть "сообщение", которое говорит это:
Типы сопоставления: BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB -> String System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB6AFF6F6F6F6F6B6A1R6B5A6B1015
Путь назначения: FoundBookcaseItemViewModel.Authors
Исходное значение: System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB
И еще есть свойство stacktrace, которое говорит:
в System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
в System.Linq.SystemCore_EnumerableDebugView`1.get_Items()
И, наконец, есть еще одно свойство, называемое "контекст", со следующими данными:
Может кто-нибудь объяснить, что здесь происходит и почему мой код больше не работает? Недавно я внес пару изменений в свое решение, но откатил их с помощью Git, поэтому они не должны влиять на код.
Моя настройка
- Visual Studio 12 RC
- ASP.NET MVC 4
- .NET Framework 4.0 (у меня была 4.5, но это вызвало слишком много ошибок, поэтому я откатился с Git до версии 4.0)
- Entity Framework 5.0 RC
- AutoMapper 2.1.267
Сущность и ViewModel
Я не знаю, уместно ли это, но вот исходный класс для сопоставления:
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";
}
}
И это класс назначения для отображения:
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; }
}
1 ответ
Кажется, что есть проблема с отображением свойства авторов. Этот агрегированный вызов вызовет исключение, если последовательность Authors пуста или пуста.
.ForMember(x => x.Authors,
opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))