我一直在使用AutoMapper,它似乎讓我所有的子實體(即使我沒有在「Include()」子句中指定它們)。有沒有辦法如何使延遲加載成爲可能,並且只有在指定它們的情況下才能獲得子屬性。automapper是否阻止使用EF進行延遲加載?
謝謝
的Jakub
我一直在使用AutoMapper,它似乎讓我所有的子實體(即使我沒有在「Include()」子句中指定它們)。有沒有辦法如何使延遲加載成爲可能,並且只有在指定它們的情況下才能獲得子屬性。automapper是否阻止使用EF進行延遲加載?
謝謝
的Jakub
映射後,您將有沒有任何引用源實體(其中包含用於延遲加載數據庫上下文)的映射對象。只有屬性值被複制到目標實體。所以如果沒有源實體,您將無法進行任何延遲加載。
實際上,懶加載對你來說工作得很好 - 而且它在映射過程中發生。您爲實體的延遲加載屬性指定了映射,並且映射器試圖獲取這些值。這導致延遲加載您爲映射配置的所有導航屬性。這是非常低效的。要在映射期間禁用延遲加載,您可以忽略映射配置中的導航屬性。例如。如果你有客戶懶加載命令:從您的目的地實體CustomerDto
Mapper.CreateMap<Customer, CustomerDto>()
.ForMember(s => s.Orders, m => m.Ignore());
或者刪除Orders
財產。如果您需要在內部有訂單的實例CustomerDto
,那麼最好的選擇是儘快加載訂單,以避免額外的查詢。
我認爲最好的辦法是根據你的需要來定義您的映射對象。在映射對象中,只定義所需的子實體。讓我們來看看像這樣的一些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..
}
謝謝您的建議。 –
我同意,如果您想從普通光源切換到光源並重新切換,automappers cache會非常困難。您需要開始使用Mapper.Reset()並再次執行所有映射。這是一個更好的解決方案,但更好的解決方案是,automapper首先不會造成這些問題。 –
更好使PersonDto繼承PersonLiteDto –
你好,是的,這是我認爲最好的方法。謝謝 –