11

どういうわけか、私のコードはもう機能しません (以前はまったく同じコードで機能していました)。これが問題です:

コード

このコードを使用して、いくつかのオブジェクトをViewModelにマップしようとしています:

構成:

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 -> 文字列

宛先パス: FoundBookcaseItemViewModel.Authors

ソース値: System.Data.Entity.DynamicProxies.BookcaseItem_B9B52593B2659AC05C47AB2A6E0F7AEA9989CC34D3527DF5B6AA988ED57166FB

そして、次のスタックトレース プロパティがあります。

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

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

ああ、最後に、次のデータを持つ「コンテキスト」と呼ばれる別のプロパティがあります。

ここに画像の説明を入力

ここで何が起こっているのか、なぜ私のコードが機能しなくなったのか、誰か説明できますか? 最近、ソリューションにいくつかの変更を加えましたが、Git によってそれらをロールバックしたので、コードには何の影響もありません。

私のセットアップ

  • ビジュアル スタジオ 12 RC
  • ASP.NET MVC 4
  • .NET Framework 4.0 (私は 4.5 を持っていましたが、エラーが多すぎたため、Git でバージョン 4.0 にロールバックしました)
  • エンティティ フレームワーク 5.0 RC
  • オートマッパー 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

1 に答える 1

4

Authors プロパティのマッピングに問題があるようです。Authors シーケンスが null または空の場合、この Aggregate 呼び出しは例外をスローします。

.ForMember(x => x.Authors, 
           opt => opt.MapFrom(src => src.Book.Authors.Select(x => x.Name).Aggregate((i, j) => i + ", " + j)))
于 2012-06-17T16:36:59.833 に答える