AutoMapper.dll中出现类型“AutoMapper.AutoMapperMappingException”的异常,但未在用户代码中处理 [英] An exception of type 'AutoMapper.AutoMapperMappingException' occurred in AutoMapper.dll but was not handled in user code

查看:1212
本文介绍了AutoMapper.dll中出现类型“AutoMapper.AutoMapperMappingException”的异常,但未在用户代码中处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

不知怎的,我的代码不再工作了(以前使用完全相同的代码)。这是问题:



代码



我正在尝试映射一些使用此代码的ViewModels对象:



配置:

  .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\\\
):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.MapFro m(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>);

返回PartialView(viewModels);
}

错误



这会导致以下错误:


AutoMapper中出现了类型AutoMapper.AutoMapperMappingException的异常。 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属性说: / p>


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



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


哦,最后还有一个名为context的属性,其中包含以下数据:





任何人都可以解释这里发生了什么,为什么我的代码不工作不再?我最近对我的解决方案做了一些修改,但是我已经把它们放回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 / p>

我不知道是否相关,但这里是映射的源类:

  public class BookcaseItem:Entity 
{
public Guid Id {get;组; }
public bool IsRenting {get;组; }
public bool IsSwapping {get;组; }
public bool IsSelling {get;组; }
public decimal RentingPrice {get;组; }
public decimal SellingPrice {get;组; }
public string Currency {get;组; }
public bool IsAvailable {get;组; }
public virtual Guid BookId {get;组; }
public virtual Guid UserId {get;组; }

public virtual Book Book {get;组; }
public virtual User User {get;组; }

public BookcaseItem()
{
IsAvailable = true;
Currency =USD;
}
}

这是映射的目标类: / p>

  public class FoundBookcaseItemViewModel 
{
public Guid Id {get;组; }
public bool IsRenting {get;组; }
public bool IsSwapping {get;组; }
public bool IsSelling {get;组; }
public decimal RentingPrice {get;组; }
public decimal SellingPrice {get;组; }
public string标题{get;组; }
public string Authors {get;组; }
public string标识符{get;组; }
public int Pages {get;组; }
public string ImageUri {get;组; }
}


解决方案

映射Authors属性的问题。如果Authors序列为空或为空,则此聚合调用将抛出异常。

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


Somehow my code doesn't work any more (it did work before with the exact same code). This is the problem:

The code

I'm trying to map some objects to ViewModels with this code:

Configuration:

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));

The usage:

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

The error

This results in the following error:

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

The debug data

First of all I ensure that there are no configuration errors by calling:

Mapper.AssertConfigurationIsValid();

I've set breakpoints all over my code and try to debug it, but I can't make sense of it. The 'items' collection is filled with data (proxy classes generated by Entity Framework), but the the 'viewModels' collection is filled with strange data. It has a 'message' that says this:

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

And then there's a stacktrace property that says:

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

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

Oh and finally there's another property called 'context' with the following data:

Can anyone explain what's going on here and why my code isn't working any longer? I did a couple of changes to my solution recently, but I've rolled them back by Git, so they shouldn't have any effect on the code.

My setup

  • Visual Studio 12 RC
  • ASP.NET MVC 4
  • .NET Framework 4.0 (I had 4.5 but that caused too many errors, so I rolled back with Git to version 4.0)
  • Entity Framework 5.0 RC
  • AutoMapper 2.1.267

The entity and ViewModel

I don't know if it's relevant, but here is the source class for the mapping:

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

And this is the destination class for the mapping:

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

解决方案

It seems like there is a problem with mapping Authors property. This Aggregate call will throw an exception if the Authors sequence is null or empty.

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

这篇关于AutoMapper.dll中出现类型“AutoMapper.AutoMapperMappingException”的异常,但未在用户代码中处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆