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。
您可以通过显式提供ProjectUsing
和ConvertUsing
指定要与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和业务层中使用它。
- 为什么使用“新的NetworkCredential(用户名,密码)”不适用于我的网站的基本身份validation(来自WinForms C#应用程序)?
- Combobox onkeypress事件的自动完成function会占用Enter键
- 协方差如何比多态更冷……而不是多余的?
- 在枚举通过它时修改.NET字典
- Generic方法可以处理Reference和Nullable Value类型吗?
- 我们可以在ASP.NET中为pagemethod和webmethod使用相同的数据表吗?
- ProtoBuf.net序列化派生类时不包括基类属性
- WebClient运行javascript
- 当我没有Control可用时如何调用()