2013-07-24 29 views

回答

8

映射後,您將有沒有任何引用源實體(其中包含用於延遲加載數據庫上下文)的映射對象。只有屬性值被複制到目標實體。所以如果沒有源實體,您將無法進行任何延遲加載。

實際上,懶加載對你來說工作得很好 - 而且它在映射過程中發生。您爲實體的延遲加載屬性指定了映射,並且映射器試圖獲取這些值。這導致延遲加載您爲映射配置的所有導航屬性。這是非常低效的。要在映射期間禁用延遲加載,您可以忽略映射配置中的導航屬性。例如。如果你有客戶懶加載命令:從您的目的地實體CustomerDto

Mapper.CreateMap<Customer, CustomerDto>() 
     .ForMember(s => s.Orders, m => m.Ignore()); 

或者刪除Orders財產。如果您需要在內部有訂單的實例CustomerDto,那麼最好的選擇是儘快加載訂單,以避免額外的查詢。

+1

你好,是的,這是我認爲最好的方法。謝謝 –

2

我認爲最好的辦法是根據你的需要來定義您的映射對象。在映射對象中,只定義所需的子實體。讓我們來看看像這樣的一些DTO映射到域中的Person實體。

class PersonDto 
{ 
    public string Name{get;set;} 
    public PersonLiteDto Parent{get; set;} 
} 

class PersonLiteDto 
{ 
    public string Name{get;set;} 
    //no navigation properties here.. 
} 
+0

謝謝您的建議。 –

+0

我同意,如果您想從普通光源切換到光源並重新切換,automappers cache會非常困難。您需要開始使用Mapper.Reset()並再次執行所有映射。這是一個更好的解決方案,但更好的解決方案是,automapper首先不會造成這些問題。 –

+0

更好使PersonDto繼承PersonLiteDto –