2013-09-22 65 views
0

在我的銷售過程中,我使用automapper將Cart實體映射到CartModel。 購物車實體containts貨幣實體女巫應映射到CurrencyCode字符串。我有一個問題,應該是由nHibernate在存儲庫方法中明確提取的貨幣實體,或者當我在我的映射規則中保留時,這是可以的? 什麼是最佳解決方案?使用NHibernate和Automapper獲取數據

老實說,我認爲automapper不應該發送查詢到數據庫中,我是對的?

映射:

Mapper.CreateMap<Cart, CartModel>() 
    .ForMember(dest => dest.Amount, src => src.MapFrom(s => s.ArticleList.Count)) 
    .ForMember(dest => dest.CurrencyCode, src => src.MapFrom(s => s.Currency.Code)) 
    .ForMember(dest => dest.CartLines, src => src.MapFrom(s => s.ArticleList)); 

CartService:

public virtual CartModel GetCartInfo(long cartId) 
{ 
    var dto = new CartModel(); 
    var cart = _cartRepository.GetForCartSummary(cartId); 
    Mapper.Map(cart, dto); 

return dto; 
} 

CartRepository:

public Cart GetForCartSummary(long cartId) 
{ 
    return Session.Query<Cart>() 
       .Where(c => c.Id == cartId) 
      // .Fetch(c => c.Currency) 
       .FetchMany(c => c.ArticleList) 
       .Single(); 
    } 

回答

0

它實際上應該取決於你如何設置爲您的購物車中NHibernate的映射。 如果Currency未被映射爲延遲加載,則映射器不會強制nhibernate再次查詢數據庫。 如果你正確地映射了你的實體(我的意思是nhibernate映射,而不是自動映射器),那麼nhibernate將嘗試在一個查詢中檢索對象(以及所有依賴關係)。

+0

是的,我知道。我在nHibernate中啓用了延遲加載,因此在調用automapper時會獲取數據。但是,確定,該自動映射器運行查詢? – Adrian

+0

這取決於,如果你總是使用automapper映射對象和子對象,那麼它沒有任何意義,懶加載它...... 正如我所說,定義它不懶惰,否則你只會運行太多查詢來檢索您的對象... 或者,如果您不需要調用新查詢的子屬性,請不要自動映射它們... – MichaC

+0

感謝您的明確答案。 – Adrian

0

我建議直接從您的查詢加載到您的dto對象。它會避免這些類型的問題。

讓你的查詢將是這個樣子

在Session.Query() 其中c.Id == cartId 選擇新CartModel {金額= c.ArticleList.Count,貨幣代碼= C的回報(從C .Currency.Code,CartLines = c.ArticleList})。Single();

我猜測ArticleList是一個映射到購物車對象的集合。我會將BatchSize添加到該映射中,以便一次提取子項1。

+0

你認爲使用nhibernate延遲加載通常是一個不好的做法時,實體屬性爲dto? – Adrian

+0

我不會那麼說。當我用NHibernate進行開發時,我活着記錄下所有的SQL語句,以瞭解NHibernate正在做什麼。這告訴我是否需要更改我的映射以添加Fetch或BatchSizes。 – Fran