2016-08-18 105 views
0

我們有一個複雜的對象用戶,其中包含一堆其他對象的列表。自動映射器不會忽略錯誤的屬性

User 
    List<User> Subordinates {get; set;} 
    etc.... 

當我們運行的代碼,這是完全可以接受的一些屬性是錯誤的,因爲與數據庫的連接已關閉,我們沒有得到下屬說。

在AutoMapper中,當我試圖將用戶類映射到另一個類時出現錯誤。

所以在下屬屬性中的錯誤是;

'((System.Data.Entity.DynamicProxies.User_26F7582000F06E0D5B307573194E69014E40D1C586E95D4E4932757C1F4DE360)((System.Data.Entity.DynamicProxies.WorkflowTask_DEDE69BC0D3CAFD0CCDA62406BC48A7A7CCBD5E8B13369FF5E761B64348A767C)thisTask).User).Subordinates' threw an exception of type 'System.ObjectDisposedException' 

和AutoMapper拋出的錯誤是;

{"Error mapping types.\r\n\r\nMapping types:\r\nWorkflowTask -> jsonTask\r\nDataRepository.WorkflowTask -> Tasks.Models.jsonTask\r\n\r\nType Map configuration:\r\nWorkflowTask -> jsonTask\r\nDataRepository.WorkflowTask -> Tasks.Models.jsonTask\r\n\r\nProperty:\r\nUser"} 

然後在InnerException;

{"Error mapping types.\r\n\r\nMapping types:\r\nUser -> jsonUser\r\nDataRepository.User -> Tasks.Models.jsonUser\r\n\r\nType Map configuration:\r\nUser -> jsonUser\r\nDataRepository.User -> Tasks.Models.jsonUser\r\n\r\nProperty:\r\nSubordinates"} 

我只是需要AutoMapper忽略那些錯誤的屬性。

回答

2

的根本原因是該數據是懶加載到實體,通常內部的using(var context = new MyDbContext())塊,並且AutoMapper嘗試卸載屬性上下文塊外映射,觸發裝載,因此System.ObjectDisposedException因爲上下文已經設置。

您需要做的是不是忽略未能加載的屬性,但要確保所有屬性在映射之前都已正確加載。我建議你閱讀this guidance,它顯示瞭如何將控制器,實體和dbcontext放入正確的圖層。

+0

謝謝你,是的,我會得出同樣的結論。我遇到的問題是我不需要「加載」實體,我當然不希望將所有事情都回傳給視圖。我只想回傳需要的東西,在這種情況下,下屬並不是必需的。只是想減少傳回的金額。感謝您的鏈接,我會給你一個閱讀。 – griegs

+0

@griegs如果視圖中不需要屬性,則應從相應的視圖模型中刪除它們。如果一個視圖需要它們,但另一個視圖不需要,則應該創建不同的視圖模型,而不是共享一個視圖模型。 –

+0

是的好點!謝謝丹尼,那就是我要做的。我正走在一條非常黑暗的道路上,只需要有人爲這個愚蠢點亮一盞燈。謝謝。 +1 – griegs