2011-12-06 68 views
2

夥計們, 我在我的業務層使用automapper映射EF對象簡單波蘇斯。我有一個在EF許多關係某些實體,但我想限制多少這個被拉到從DB回來。其中一個實體將映射到數據庫表,但必須將出現在生成的模型(EDMX)實體集合其他表多對多的關係。限制延遲加載,而自動映射EF實體類型

因此,我已經創建了其中只有POCO屬性的屬性在該實體的第一級上的實體,即某個整數ID而不是關聯集合/實體集合「淺」 POCO。我映射以下列方式....

var simplepocoforentity= Mapper.Map(_readOnlyDb.Single<EfEntity>(x => x.Id== Id), 
            new SimplPocoForEntity()); 

我的問題是..因爲我只映射實體在這裏簡單的POCO,我可以確信EF不會嘗試和查詢等非引用的數據從底層的數據庫表關係,當我做映射?

我知道,我可以通過SQL事件探查調查,但我將不勝感激油膩的東西這條路線的任何輸入。 謝謝 K.

回答

2

它取決於AutoMapper的內部實現。我會認爲AutoMapper不會嘗試訪問實體的導航屬性(在這種情況下,延遲加載和一個額外的數據庫查詢會踢)。如果只映射標量屬性,我看不出AutoMapper應該這樣做的原因。但誰知道...

如果你想成爲安全起見,你可以禁用延遲加載暫時:

try 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = false; 

    var simplepocoforentity = Mapper.Map(_readOnlyDb.Entities 
     .Single(x => x.Id == Id), new SimplPocoForEntity()); 

    // ... 
} 
finally 
{ 
    _readOnlyDb.ContextOptions.LazyLoadingEnabled = true; 
} 

作爲一個方面說明:請注意,您加載完整實體與上下文這種方法。之後,映射發生。您可能會從數據庫加載比您真正需要的更多列(可能不在您的特例中)。一般來說,我會做的映射與確保投影數據庫只查詢所需要的列:

var simplepocoforentity = _readOnlyDb.Entities 
    .Where(e => e.Id == Id) 
    .Select(e => new SimplPocoForEntity 
    { 
     PocoProperty1 = e.EntityProperty1, 
     PocoProperty2 = e.EntityProperty2, 
     PocoProperty3 = e.EntityProperty3 
     // etc. 
    }) 
    .Single(); 

使用這種方法,因爲你不加載實體沒有延遲加載會發生在所有,而是直接來自數據庫的PocoForEntity。