如何解决AutoMapper错误? (stackoverflow异常!) [英] How to resolve AutoMapper error? (stackoverflow exception!)

查看:142
本文介绍了如何解决AutoMapper错误? (stackoverflow异常!)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为以下课程使用 AutoMapper + EF(Entities => POCO):

  public class Category 
{
public int CategoryID {get;组; }

public string Name {get;组; }

public Category Parent {get;组; }

public IList< Category>孩子{get;组;由于这个类与自己有关系(父/子),所以AutoMapper去了疯狂,并抛出一个Stackoverflow异常。有没有人遇到过这个问题?

解决方案

我已经通过创建CustomValueResolvers解决了。这不是美丽的事情,但它正在工作。

  Mapper.CreateMap< Category,CategoryDTO>()
.ForMember(c => c.Parent,opt => opt.ResolveUsing< ParentResolver>())
.ForMember(c => c.Children,opt => opt.ResolveUsing< ChildrenResolver> ;());

Mapper.CreateMap< CategoryDTO,Category>()
.ForMember(c => c.Parent,opt => opt.ResolveUsing< ParentDTOResolver>())
.ForMember(c => c.Children,opt => opt.ResolveUsing< ChildrenDTOResolver>());


public class ParentResolver:ValueResolver< Category,CategoryDTO>
{
protected override CategoryDTO ResolveCore(Category category)
{
CategoryDTO dto = null;

if(category.Parent!= null)
dto = Mapper.Map< Category,CategoryDTO>(category.Parent);

return dto;
}
}

public class ParentDTOResolver:ValueResolver< CategoryDTO,Category>
{
protected override类别ResolveCore(CategoryDTO类别)
{
类别poco = null;

if(category.Parent!= null)
poco = Mapper.Map< CategoryDTO,Category>(category.Parent);

return poco;
}
}

public class ChildrenResolver:ValueResolver< Category,EntityCollection< CategoryDTO>>
{
protected override EntityCollection< CategoryDTO> ResolveCore(Category category)
{
EntityCollection< CategoryDTO> dtos = null;

if(category.Children!= null&& category.Children.Count> 0)
dtos = Mapper.Map< IList< Category>,EntityCollection< CategoryDTO>> (category.Children);

return dtos;
}
}

public class ChildrenDTOResolver:ValueResolver< CategoryDTO,IList< Category>>
{
protected override IList< Category> ResolveCore(CategoryDTO类别)
{
IList< Category> pocos = null;

if(category.Children!= null&& category.Children.Count> 0)
pocos = Mapper.Map< EntityCollection< CategoryDTO>,IList< Category> (category.Children);

return pocos;
}
}


I am using AutoMapper + EF (Entities => POCO) for the following class:

public class Category
{
    public int CategoryID { get; set; }

    public string Name { get; set; }

    public Category Parent { get; set; }

    public IList<Category> Children { get; set; }
}

Since this class has relationship with itself (Parent / Children), AutoMapper went crazy and threw a Stackoverflow exception. Have ever any of you experienced this problem?

解决方案

I've resolved it by creating CustomValueResolvers. It is not the beautiful thing to do, but it is working.

Mapper.CreateMap<Category, CategoryDTO>()
                .ForMember(c => c.Parent, opt => opt.ResolveUsing<ParentResolver>())
                .ForMember(c => c.Children, opt => opt.ResolveUsing<ChildrenResolver>());

Mapper.CreateMap<CategoryDTO, Category>()
                .ForMember(c => c.Parent, opt => opt.ResolveUsing<ParentDTOResolver>())
                .ForMember(c => c.Children, opt => opt.ResolveUsing<ChildrenDTOResolver>());


public class ParentResolver : ValueResolver<Category, CategoryDTO>
    {
        protected override CategoryDTO ResolveCore(Category category)
        {
            CategoryDTO dto = null;

            if (category.Parent != null)
                dto = Mapper.Map<Category, CategoryDTO>(category.Parent);

            return dto;
        }
    }

    public class ParentDTOResolver : ValueResolver<CategoryDTO, Category>
    {
        protected override Category ResolveCore(CategoryDTO category)
        {
            Category poco = null;

            if (category.Parent != null)
                poco = Mapper.Map<CategoryDTO, Category>(category.Parent);

            return poco;
        }
    }

    public class ChildrenResolver : ValueResolver<Category, EntityCollection<CategoryDTO>>
    {
        protected override EntityCollection<CategoryDTO> ResolveCore(Category category)
        {
            EntityCollection<CategoryDTO> dtos = null;

            if (category.Children != null && category.Children.Count > 0)
                dtos = Mapper.Map<IList<Category>, EntityCollection<CategoryDTO>>(category.Children);

            return dtos;
        }
    }

    public class ChildrenDTOResolver : ValueResolver<CategoryDTO, IList<Category>>
    {
        protected override IList<Category> ResolveCore(CategoryDTO category)
        {
            IList<Category> pocos = null;

            if (category.Children != null && category.Children.Count > 0)
                pocos = Mapper.Map<EntityCollection<CategoryDTO>, IList<Category>>(category.Children);

            return pocos;
        }
    }

这篇关于如何解决AutoMapper错误? (stackoverflow异常!)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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