2012-06-17 1 views
11

Как-то мой код больше не работает (он работал раньше с тем же кодом). Это проблема:Исключение типа «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); 
} 

Ошибка

Это приводит к следующей ошибке:

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

отладочной данные

Прежде всего я могу гарантировать, что нет никаких ошибок конфигурации по телефону:

Mapper.AssertConfigurationIsValid(); 

Я установил точки останова по всему моему коду и попытаюсь его отладить, но я не могу понять это. Коллекция «items» заполнена данными (прокси-классы, созданные Entity Framework), но коллекция «viewModels» заполнена странными данными. Он имеет «сообщение», которое говорит, что это:

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

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

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

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

ответ

4

Похоже, что существует проблема с картографированием Авторы prope RTY. Этот вызов Aggregate выдаст исключение, если последовательность авторов будет пустой или пустой.

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

Похоже, вы нашли корень проблемы, хороший сэр. Я добавил нулевую проверку в методе MapFrom(), и теперь исключение исчезло :) –

+0

@LeonCullens Вам также следует добавить пустой чек. –

+0

Ну, «Авторы» - это набор строк, поэтому я просто проверяю, содержит ли коллекция более чем 0 элементов (строки в коллекции не могут быть пустыми или пустыми, которые обрабатываются в другом месте) :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^