2016-11-21 117 views
3

我想使用AutoMapper在表达式中的两个模型之间进行映射,但从AutoMapper接收到一个错误:“错误映射类型”与内部异常消息“对象引用未设置为对象的实例“。自动映射表达式错误:空引用/错误映射类型和ReverseMap

设置我的配置和通过以下在Github维基定义的映射:

Configuration

Expression Translation

下面是一个非常简化的示例,其产生使用版本AutoMapper 5.1错误0.1。

模型到地图

注意:我只需要映射从模型1到模型2。

public class Model1 
{ 
    public int Id { get; set; } 
} 

public class Model2 
{ 
    public int Id { get; set; } 
} 

配置:

public static class AutoMapperConfig 
{ 
    public static IMapper Mapper; 

    static AutoMapperConfig() 
    { 
     var config = new MapperConfiguration(c => { 
      // Produces error 
      CreateMap<Model1, Model2>(); 

      //The below definitions do NOT produce error 
      CreateMap<Model1, Model2>().ReverseMap(); 
      //OR 
      CreateMap<Model1, Model2>(); 
      CreateMap<Model2, Model1>(); 
      //OR 
      CreateMap<Expression<Func<Model1,bool>>, Expression<Func<Model2,bool>>>(); 

     }); 

     Mapper = config.CreateMapper(); 
    } 
} 

用法:

Expression<Func<Model1, bool>> model1Expr = x => x.Id == 2; 
var model2Expr = AutoMapperConfig.Mapper.Map<Expression<Func<Model2,bool>>>(model1Expr); 

我收到错误在声明上述model2Expr变量的行。

错误从ELMAH :(

[NullReferenceException: Object reference not set to an instance of an object.] 
AutoMapper.Mappers.MappingVisitor.PropertyMap(MemberExpression node) +109 
AutoMapper.Mappers.MappingVisitor.VisitMember(MemberExpression node) +95 
System.Linq.Expressions.MemberExpression.Accept(ExpressionVisitor visitor) +14 
System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) +22 
AutoMapper.Mappers.MappingVisitor.VisitBinary(BinaryExpression node) +73 
System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor) +14 
System.Linq.Expressions.ExpressionVisitor.Visit(Expression node) +22 
AutoMapper.Mappers.ExpressionMapper.Map(TSource expression, ResolutionContext context) +1534 
lambda_method(Closure , Object , Object , ResolutionContext) +183 

[AutoMapperMappingException: Error mapping types. 

重要:一个同事注意,当被定义双向映射未遇到错误(带有ReverseMap或两个分开的语句CreateMap),或者当所述映射明确定义为表达式类型之间的表达式转换链接确实定义了模型之间的双向映射,但没有明确提及要求。

问题:

我是不是搞乱了配置和/或映射定义,或者是在表达式中的对象之间进行映射时所需的双向映射定义,而维基只是没有明确地说明它?


UPDATE: 我对AutoMapper GitHub打开的问题。 截至目前似乎

Yes the order is backwards when doing expression translation.

基本上,这意味着,如果你想表达之间的映射,在你需要的映射的相反方向创建一个映射定义:

CreateMap<Model2, Model1>(); 
//.... 
Expression<Func<Model1, bool>> model1Expr = x => x.Id == 2; 
var model2Expr = AutoMapperConfig.Mapper.Map<Expression<Func<Model2,bool>>>(model1Expr); 
+0

用法与配置为从* Model1对象*映射到* Model2对象*的映射不同。 – Win

+0

@Win我刚刚尝试在表达式本身之间定义一个单向映射,并且我没有收到错误。我之前没有尝试过,因为根据我在Expression Translation wiki中理解的内容,对象之间的地图定义就足够了。这可能只是一个不完整的文档案例吗? – karol

+0

Automapper旨在将对象的属性映射到另一个对象。为什么要从***表达式树映射到另一个?它不应该是Automapper的工作。 – Win

回答

0

您需要请拨打ReverseMap,如下所示:

static AutoMapperConfig() 
{ 
    var config = new MapperConfiguration(c => { 
     CreateMap<Model1, Model2>().ReverseMap(); // <====== 
    }); 

    Mapper = config.CreateMapper(); 
} 
+0

谢谢你的回答。您能否提供说明需要使用ReverseMap的文档?我的同事发现了和你一样的东西,我只是想知道为什么它不在wiki中。 – karol

+0

默认情况下不提供ReverseMap。它被添加到AutoMapper中,您必须调用它来创建它。这里是提交他们这样做的时候:https://github.com/AutoMapper/AutoMapper/commit/bff6e2aa49af3e7b50f527376da48924efa7d81e – CodingYoshi

+0

对不起,我的意思是问,如果有文件,指出双向映射必须定义(或者与ReverseMap或两个独立的CreateMap语句),以便表达式之间的映射能够正常工作。 – karol