2016-11-21 138 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