CodeGo.net>使用Automapper项目

我目前在后端使用automapper将对象映射到模型.
我最近决定使用以下代码来处理我所有的时区转换:

  cfg.CreateMap<DateTime?, DateTime?>()
  .ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours));

  cfg.CreateMap<DateTime, DateTime>()
  .ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value);


  Object.ProjectTo<ObjectModel>().SingleOrDefault();

然后工作正常,对象被映射并转换时区

但是,当我在业务层中使用以下代码进行单个对象映射时:

Mapper.Map<Object, ObjectModel>(singleRecord); 

它给出一个错误:
此函数只能从LINQ到Entities调用.

堆栈跟踪 :

at System.Data.Entity.DbFunctions.AddHours(Nullable`1 timeValue, Nullable`1 addValue)
   at lambda_method(Closure , DateTime , DateTime , ResolutionContext )
   at AutoMapper.ResolutionContext.Map[TSource,TDestination](TSource source, TDestination destination)
   at lambda_method(Closure , Inventory , InventoryModel , ResolutionContext )

Mapper.Map对于在特定情况下使用非常重要,我也不想投影单个记录.

有办法解决吗?

解决方法:

默认情况下,AutoMapper将构建映射Func< TSource,TDestination>.通过编译Expression< TFunc< TSource,TDestionation>传递给ProjectUsing并由ProjectTo使用,因为通常它就足够了并且可以工作.但不具有EF规范功能.

您可以通过显式提供ProjectUsing和ConvertUsing来指定与Map方法一起使用的另一种转换来覆盖该行为:

var map1 = cfg.CreateMap<DateTime?, DateTime?>();
map1.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours));
map1.ConvertUsing(i => i?.AddHours(offset.Hours));

var map2 = cfg.CreateMap<DateTime, DateTime>();
map2.ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value);
map2.ConvertUsing(i => i.AddHours(offset.Hours));
上一篇:C#-AutoMapper覆盖递归类型


下一篇:我告诉AutoMapper为什么不访问属性?