Как устранить ошибку AutoMapper? (исключение stackoverflow!) - PullRequest
5 голосов
/ 10 августа 2009

Я использую AutoMapper + EF (Entities => POCO) для следующего класса:

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

    public string Name { get; set; }

    public Category Parent { get; set; }

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

Поскольку этот класс связан с самим собой (Parent / Children), AutoMapper сошел с ума и выдал исключение Stackoverflow. Кто-нибудь из вас сталкивался с этой проблемой?

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

Я решил это, создав 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 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;
        }
    }
0 голосов
/ 10 августа 2009

Это, кажется, известная проблема. Automapper заходит в бесконечный цикл.

Вот ссылка на того, кому удалось обойти эту проблему:

http://blogs.ugidotnet.org/lmauri/archive/2009/05/02/automapper-efpocogenerator-entityframework-and-associations.aspx

Добавьте сюда ссылку на переведенную версию этой страницы:)

http://translate.google.com/translate?hl=en&sl=it&u=http://blogs.ugidotnet.org/lmauri/archive/2009/05/02/automapper-efpocogenerator-entityframework-and-associations.aspx&ei=UneASvahFoPe-Qa_38RU&sa=X&oi=translate&resnum=2&ct=result&prev=/search%3Fq%3Dstackoverflow%2Bautomapper%26hl%3Den%26sa%3DN%26start%3D20

...