2017-05-30 43 views
3

我目前使用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調用實體。

堆棧跟蹤:

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是在特定情況下使用很重要,我也不想對項目單記錄。

是有辦法解決這?

回答

1

默認AutoMapper將建立一個映射Func<TSource, TDestination>>使用由Map方法通過編譯傳遞給ProjectUsingProjectTo使用的Expression<TFunc<TSource, TDestionation>>,因爲通常它是足夠和作品。但與EF規範功能不同。

你可以通過指定不同的轉換重寫該行爲與Map方法,通過提供明確雙方ProjectUsingConvertUsing使用:

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)); 
+0

嘿@ivan,感謝您的回答,我認爲它的工作,我在我們發言時實施它。 – DaGeek

+0

您能否向我解釋一些事情: 項目是否正在使用數據庫級別運行? 是否使用在Cpu級別上運行進行轉換? EF Canonical功能意味着什麼? – DaGeek

+1

(1)EF Canonical函數是'DbFunctions'中的函數。正如你注意到的,它們並不意味着被執行。就像'IQueryable'表達式樹內已知的「佔位符」,EF查詢翻譯器將它們映射到SQL查詢中相應的數據庫函數調用。(2)是的,因爲'ConvertUsing'接收到一個'Func <...>'(讀取代碼),它不能映射到SQL,所以它被'Map'方法所使用,這些方法在內存對象中操作。 –

0

從MSDN:

提供公共語言運行時(CLR),該暴露EDM規範>功能中的DbContext或ObjectContext的LINQ使用到Entities查詢方法。

所以錯誤是可以預料的,因爲投影不會在LINQ to Entities查詢中執行。

DbFuncions.AddHours()調用轉換爲數據庫的功能。由於在您的業務層中,您沒有傳遞實體,而是傳遞了一個對象,所以會引發錯誤。

有兩種方法來解決此問題: 1.使用你的經營業務層不同的映射邏輯。 2.使用不依賴於DbFunctions類,以便它可以在你的DAL和業務層中使用的映射邏輯。