Подтвердить что ты не робот

Исключение типа "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_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB → System.String

Путь назначения: FoundBookcaseItemViewModel.Authors

Исходное значение: System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB

И тогда есть свойство stacktrace, которое говорит:

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

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

О, и, наконец, еще одно свойство, называемое контекстом, со следующими данными:

enter image description here

Может ли кто-нибудь объяснить, что происходит здесь и почему мой код больше не работает? Недавно я сделал несколько изменений в моем решении, но я вернул их обратно на 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; }
}
4b9b3361

Ответ 1

Кажется, что существует проблема с отображением свойства Authors. Этот вызов Aggregate выдает исключение, если последовательность авторов является пустой или пустой.

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