entity-framework - 如何解决 AutoMapper 错误? (stackoverflow 异常!)

标签 entity-framework c#-3.0 automapper

我正在使用 AutoMapper + EF(实体 => 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; }
}

由于这个类与自身(父/子)有关系,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 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;
        }
    }

关于entity-framework - 如何解决 AutoMapper 错误? (stackoverflow 异常!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1256743/

相关文章:

c# - 我应该继续使用 Entity Framework 吗

c# - 在 Code First 的情况下使用 MetadataType 强制执行验证是否有意义?

c# - Entity Framework DbContext .Remove(obj) 与 .Entry(obj).State = EntityState.Deleted

ASP.NET Identity DbContext 混淆

c# - 标签自动换行

c# - AutoMapper - 根据条件映射到派生对象

c# - 如何使用 C# 在 asp.net 中将二进制数据流式传输到磁盘

c#-3.0 - Lambda for Dummies....任何人,任何人?我想不是

c# - 带有 IDataReader 的 AutoMapper 到 List 总是返回 0 计数

c# - AutoMapper 问题和映射 IEnumerable 集合