我目前在后端使用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));