Entity framework 如何解决自动映射错误?(堆栈溢出异常!)

Entity framework 如何解决自动映射错误?(堆栈溢出异常!),entity-framework,c#-3.0,automapper,Entity Framework,C# 3.0,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; } } 公共类类别 { public int

我对以下类使用+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; }
}
公共类类别
{
public int CategoryID{get;set;}
公共字符串名称{get;set;}
公共类别父项{get;set;}
公共IList子项{get;set;}
}

由于该类与自身(父/子类)有关系,AutoMapper发疯并抛出了Stackoverflow异常。你们中有人遇到过这个问题吗?

这似乎是一个已知的问题。Automapper进入内循环

以下是一个链接,指向设法绕过此问题的人:

此处添加指向此页面翻译版本的链接:)


我通过创建CustomValueResolver解决了这个问题。这不是一件美好的事情,但它正在发挥作用

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;
        }
    }
Mapper.CreateMap()
.FormMember(c=>c.Parent,opt=>opt.ResolveUsing())
.ForMember(c=>c.Children,opt=>opt.resolvesusing());
Mapper.CreateMap()
.FormMember(c=>c.Parent,opt=>opt.ResolveUsing())
.ForMember(c=>c.Children,opt=>opt.resolvesusing());
公共类ParentResolver:ValueResolver
{
Resolved Core的受保护覆盖类别(类别)
{
CategoryDTO=null;
如果(category.Parent!=null)
dto=Mapper.Map(category.Parent);
返回dto;
}
}
公共类ParentDTOResolver:ValueResolver
{
受保护的覆盖类别ResolveCore(CategoryTo类别)
{
类别poco=null;
如果(category.Parent!=null)
poco=Mapper.Map(category.Parent);
返回poco;
}
}
公共类子级解析程序:ValueResolver
{
受保护的覆盖EntityCollection ResolveCore(类别)
{
EntityCollection dtos=null;
如果(category.Children!=null&&category.Children.Count>0)
dtos=Mapper.Map(category.Children);
返回DTO;
}
}
公共类ChildrenDTOResolver:ValueResolver
{
受保护的覆盖IList ResolveCore(CategoryTo类别)
{
IList-pocos=null;
如果(category.Children!=null&&category.Children.Count>0)
pocos=Mapper.Map(category.Children);
返回POCO;
}
}

您能同时发布目的地类型吗?我很想修复这个错误。