2012-06-17 39 views
11

何とか私のコードはこれ以上動作しません(まったく同じコードで動作しました)。これは問題です: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); 
} 

エラーこれは、次のようなエラーになり

Mapper.AssertConfigurationIsValid(); 
を:

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

デバッグデータ私は何の設定エラーがないことを確認し、すべての

まず呼び出すことにより、

コード全体にブレークポイントを設定してデバッグしようとしましたが、わかりません。 '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()

ああ、最終的には、以下のデータを「コンテキスト」と呼ばれる別のプロパティがありますが:

それはこのことを言う「というメッセージ」を持っています

enter image description here

ここで何が起こっているのか、なぜ私のコードがもう機能していないのか説明できますか?私は最近、私のソリューションにいくつかの変更を加えましたが、私は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

エンティティとの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。 Authorsシーケンスがnullまたは空の場合、この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

「Authors」は文字列のコレクションなので、コレクションに0以上の項目が含まれているかどうかをチェックします(コレクション内の文字列はnullまたは空ではないため、別の場所で処理されます)。 –

関連する問題