AutoMapper を使用して式の 2 つのモデル間をマッピングしようとしていますが、AutoMapper から次のエラーが表示されます。
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 変数を宣言する行でエラーを受け取ります。
エルマーからのエラー:(
[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 または 2 つの個別の CreateMap ステートメントを使用して) 双方向マッピングが定義されている場合、またはマッピングが Expression 型の間であると明示的に定義されている場合、エラーは発生しないことに注意しました。上記の Expression Translation リンクでは、モデル間の双方向マッピングが定義されていますが、その必要性については明示的に言及されていません。
質問:
どういうわけか構成やマップ定義を台無しにしていますか、それとも式でオブジェクト間をマッピングするときに双方向マッピング定義が必要であり、wiki はそれを明示的に述べていませんか?
更新: AutoMapper GitHub で問題をオープンしました。今のところそうらしい
はい、式の変換を行うときの順序は逆です。
基本的にこれは、式間をマッピングしたい場合、目的のマッピングの反対方向にマッピング定義を作成することを意味します。
CreateMap<Model2, Model1>();
//....
Expression<Func<Model1, bool>> model1Expr = x => x.Id == 2;
var model2Expr = AutoMapperConfig.Mapper.Map<Expression<Func<Model2,bool>>>(model1Expr);