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)將不起作用。
謝謝 科斯明
我認爲這隻有在物業也在目的地時纔有效。在任何情況下,即使我將「分支」放在目標上並使用「忽略」選項,仍然可以訪問集合並觸發加載。 我很感興趣,如果有一個類似的功能忽略「源」成員。 – noir
@noir,「你在這裏沒有什麼需要做的,AutoMapper只關心目標成員,它只會嘗試映射它在目標類型上找到的內容。」採取從http://automapper.codeplex.com/workitem/4031 – gdoron
這也是我認爲,爲什麼打擾,甚至沒有目的地的集合。但是我做了這個簡單的測試,獲得了項目清單,並將清單映射到項目合同。我用NhProf。首先是加載項目的查詢,然後爲每個項目都有一個加載分支的查詢。如果我看着堆棧跟蹤,它指向AutoMapper.Internal.PropertyGetter.GetValue ...所以我想要想我或沒有看到什麼,或者這是一個錯誤。 – noir