不知何故,我的代碼不再工作(它以前使用完全相同的代碼工作)。這就是問題所在:在AutoMapper.dll中發生類型'AutoMapper.AutoMapperMappingException'的異常,但未在用戶代碼中處理
我想一些對象的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
再有就是,上面寫着一個堆棧跟蹤特性:
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at 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)
- 實體框架5.0 RC
- AutoMapper 2.1。267
實體和視圖模型
我不知道這是否是相關的,但這裏是該映射的源類:
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; }
}
看起來你已經找到了問題的根源好先生。我在MapFrom()方法中添加了空檢查,現在異常消失:) –
@LeonCullens您應該添加一個空檢查。 –
好了,'作者'是字符串的集合,所以我只是檢查集合是否包含多於0個項目(集合中的字符串不能爲空或空白,這在別處處理):-) –