C# Automapper:ReverseMap的最佳实践

C# Automapper:ReverseMap的最佳实践,c#,automapper,bidirectional,C#,Automapper,Bidirectional,我正在寻找有关在配置Automapper映射时使用ReverseMap的一些指导 我正在使用Automapper在我的DB实体和模型之间进行映射。为清楚起见,以下是它们的简化示例: public class Document { public string Id { get; set; } public List<Element> Elements { get; set; } } public class Element { public st

我正在寻找有关在配置Automapper映射时使用ReverseMap的一些指导

我正在使用Automapper在我的DB实体和模型之间进行映射。为清楚起见,以下是它们的简化示例:

public class Document
{
    public string Id { get; set; }
    public List<Element> Elements { get; set; }
}

public class Element
{       
    public string Name { get; set; }       
        public virtual ElementType Type { get; set; }
}

public class ElementText : Element
{      
        public string Value { get; set; }      
        public Hashtable Attributes { get; set; }      
        public override ElementType Type { get; set; }
}


public class DocumentModel
{
        public string Id { get; set; }
        public List<ElementModel> Elements { get; set; }    
}

public class ElementModel
{       
    public string Name { get; set; }       
    public virtual ElementType Type { get; }
}

public class ElementTextModel : ElementModel
{
        public string Value { get; set; }
        public Hashtable Attributes { get; set; }
        public override ElementType Type { get { return ElementType.TEXT; } }
}
公共类文档
{
公共字符串Id{get;set;}
公共列表元素{get;set;}
}
公共类元素
{       
公共字符串名称{get;set;}
公共虚拟元素类型{get;set;}
}
公共类ElementText:Element
{      
公共字符串值{get;set;}
公共哈希表属性{get;set;}
公共重写ElementType类型{get;set;}
}
公共类文档模型
{
公共字符串Id{get;set;}
公共列表元素{get;set;}
}
公共类元素模型
{       
公共字符串名称{get;set;}
公共虚拟元素类型{get;}
}
公共类ElementTextModel:ElementModel
{
公共字符串值{get;set;}
公共哈希表属性{get;set;}
公共重写ElementType类型{get{return ElementType.TEXT;}}
}
因此,文档类是主要类,在元素列表中存储元素列表和类似元素ElementText的派生类

映射配置文件:

 public MappingProfile()
        {

            this.CreateMap<Document, DocumentModel>().ReverseMap();
            this.CreateMap<Element, ElementModel>().ReverseMap();
            this.CreateMap<ElementText, ElementTextModel>().ReverseMap();
        }
publicmappingprofile()
{
this.CreateMap().ReverseMap();
this.CreateMap().ReverseMap();
this.CreateMap().ReverseMap();
}
现在,此概要文件在大多数情况下都可以工作,但无法映射列表中的派生类。它将它们映射到基类。(因此ElementText成员变为Element等)

我可以通过在配置文件中使用includealderived来解决这个问题,如下所示:

 public MappingProfile()
        {

            this.CreateMap<Document, DocumentModel>().ReverseMap();
            this.CreateMap<Element, ElementModel>()
                 .IncludeAllDerived()
                 .ReverseMap();

            this.CreateMap<ElementText, ElementTextModel>().ReverseMap();
        }
publicmappingprofile()
{
this.CreateMap().ReverseMap();
这个
.includealderived()
.ReverseMap();
this.CreateMap().ReverseMap();
}
但是.includealderived()和.reverseemap()的顺序似乎很重要。让派生类在两个方向上工作的唯一方法是使用:

 public MappingProfile()
        {

            this.CreateMap<Document, DocumentModel>().ReverseMap();
            this.CreateMap<Element, ElementModel>()
                 .IncludeAllDerived()
                 .ReverseMap().IncludeAllDerived();

            this.CreateMap<ElementText, ElementTextModel>().ReverseMap();
        }
publicmappingprofile()
{
this.CreateMap().ReverseMap();
这个
.includealderived()
.ReverseMap().includealderived();
this.CreateMap().ReverseMap();
}
这对我来说有点笨重了。我宁愿放弃ReverseMap并明确定义两个方向的映射

 public MappingProfile()
        {

            this.CreateMap<Document, DocumentModel>().ReverseMap();
            this.CreateMap<Element, ElementModel>()
                 .IncludeAllDerived()
            this.CreateMap<ElementModel, Element>()
                 .IncludeAllDerived();

            this.CreateMap<ElementText, ElementTextModel>().ReverseMap();
        }
publicmappingprofile()
{
this.CreateMap().ReverseMap();
这个
.includealderived()
这个
.includealderived();
this.CreateMap().ReverseMap();
}
所以我的问题是,我应该什么时候使用ReverseMap?从未?只有在非常简单的情况下

在两个方向上显式指定映射是否会得到相同的结果? 文档有点不清楚,除了在使用指南中,Jimmy说:

X避免在仅映射顶级非展平属性的情况下进行反向映射

反向映射可能很快变得非常复杂,除非非常简单,否则您可以在映射配置中显示业务逻辑


无论哪种方式,都需要两个
Include
-s,因为有两个映射。没有办法:)而且,
ReverseMap
与这两个贴图不同。检查。所以,除非你了解反向映射的功能,否则不要使用它。文档是我首先要去的地方。它们在解释ReverseMap到底做什么和不做什么方面的帮助要小得多。然后使用指南说不要用它来展平,这是大部分文档所说的。这就是我的问题。检查,有无
ReverseMap
。指导原则是避免复杂性,如果你不理解它,就不要使用它,但是人们在任何文档存在之前就请求了
ReverseMap
,因此对他们来说显然是有意义的。