我正在尝试使用AutoMapper在表达式中映射两个模型,但是从AutoMapper收到一个错误:“Error Mapping Types”,并且内部异常消息为“对象引用未设置为对象的实例”。
我按照Github上的wiki设置了我的配置并定义了映射:
下面是一个非常简化的示例,它使用AutoMapper 5.1.1生成错误。
要映射的模型
注意:我只需要从Model1映射到Model2。
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语句)或者将映射明确定义为两个表达式类型之间时,不会遇到错误。上面的Expression Translation链接确实定义了模型之间的双向映射,但没有明确提到需要它。
问题:
我是否在配置和/或映射定义方面出错了,或者在表达式对象之间进行映射时需要双向映射定义,而维基百科只是没有明确说明?
更新: 我在AutoMapper GitHub上开了一个问题。 目前看来,
是的,在进行表达式转换时,顺序是相反的。
基本上这意味着,如果你想在表达式之间进行映射,请按照所需映射的相反方向创建映射定义:
CreateMap<Model2, Model1>();
//....
Expression<Func<Model1, bool>> model1Expr = x => x.Id == 2;
var model2Expr = AutoMapperConfig.Mapper.Map<Expression<Func<Model2,bool>>>(model1Expr);