2011-12-03 83 views
4

我很困擾這個問題:Automapper和NHibernate延遲加載

我有一個名爲「項目」的NHibernate對象的列表。這些對象包含一個延遲加載的「分支」列表。我正在嘗試將項目列表傳遞給WCF服務,所以我使用AutoMapper將它們轉換爲平面對象。

問題是,即使名爲「ProjectContract」的目標對象不包含分支列表,Automapper仍會調用此集合,並且會對數據庫進行很多查詢,因爲NHibernate會引發延遲加載並加載每個項目的分支收集。

這裏是類和映射:

public class Project 
    { 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 

    public virtual IList<Branch> Branches { get; set; } 
    } 

    [DataContract] 
    public class ProjectContract 
    { 
    [DataMember] 
    public virtual int ID 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    public virtual string Name { get; set; } 

    [DataMember] 
    public virtual string Description { get; set; } 
    } 

    public class ProjectMappings : Profile 
    { 
    protected override void Configure() 
    { 
     Mapper.CreateMap<Project, ProjectContract>(); 
    } 
    } 

我的問題是:有沒有辦法告訴AutoMapper不碰「分行」集合,因爲我不關心它,這是一個會觸發許多數據庫調用的代理?

我暫時用MaxDepth(0)修復了這個問題,但還有其他的實體,我有我想要傳輸的集合,以及不想被觸及的集合,就像這個。在這種情況下,MaxDepth(0)將不起作用。

謝謝 科斯明

回答

2

是的,AutoMapper忽略功能。

Mapper.CreateMap<Source, Destination>() 
    .ForMember(dest => dest.SomeValuefff, opt => opt.Ignore()); 
+0

我認爲這隻有在物業也在目的地時纔有效。在任何情況下,即使我將「分支」放在目標上並使用「忽略」選項,仍然可以訪問集合並觸發加載。 我很感興趣,如果有一個類似的功能忽略「源」成員。 – noir

+2

@noir,「你在這裏沒有什麼需要做的,AutoMapper只關心目標成員,它只會嘗試映射它在目標類型上找到的內容。」採取從http://automapper.codeplex.com/workitem/4031 – gdoron

+0

這也是我認爲,爲什麼打擾,甚至沒有目的地的集合。但是我做了這個簡單的測試,獲得了項目清單,並將清單映射到項目合同。我用NhProf。首先是加載項目的查詢,然後爲每個項目都有一個加載分支的查詢。如果我看着堆棧跟蹤,它指向AutoMapper.Internal.PropertyGetter.GetValue ...所以我想要想我或沒有看到什麼,或者這是一個錯誤。 – noir