Automapper项目使用

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

cfg.CreateMap() .ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours)); cfg.CreateMap() .ProjectUsing(i => DbFunctions.AddHours(i, offset.Hours).Value); Object.ProjectTo().SingleOrDefault(); 

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

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

 Mapper.Map(singleRecord); 

它给出了一个错误:只能从LINQ to 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将通过编译传递给ProjectUsing并由ProjectTo使用的Expression>来构建映射Func>以供Map方法使用,因为通常它足够并且有效。 但不是EF规范function。

您可以通过显式提供ProjectUsingConvertUsing指定要与Map方法一起使用的其他转换来覆盖该行为:

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

来自MSDN:

提供公共语言运行时(CLR)方法,公开EDM规范>函数以在DbContext或ObjectContext LINQ to Entities查询中使用。

因此,错误是预期的,因为投影不在LINQ to Entities查询中执行。

DbFuncions.AddHours()调用被转换为数据库函数。 由于在业务层中您没有传递实体而是传递对象,因此会抛出错误。

您有两种方法可以解决此问题:1。在业务层中使用不同的映射逻辑。 2.使用不依赖于DbFunctions类的映射逻辑,以便可以在DAL和业务层中使用它。