使用NHibernate和Automapper获取数据

时间:2013-09-22 08:32:07

标签: c# nhibernate automapper

在我的销售过程中,我使用automapper将Cart实体映射到CartModel。 Cart实体包含Currency实体应该映射到CurrencyCode字符串。我有一个问题,应该是在存储库方法中由nHibernate显式获取的Currency实体,或者当我将其留在映射规则中时,这是正常的吗? 什么是最好的解决方案?

老实说,我认为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();
  }

2 个答案:

答案 0 :(得分:0)

它实际上应该取决于你如何设置购物车的nhibernate映射。 如果Currency未映射为延迟加载,则映射器不会强制nhibernate再次查询数据库。 如果你正确地映射(我的意思是nhibernate映射,而不是自动化)你的实体,nhibernate将尝试在一个查询中检索对象(和所有依赖项)。

答案 1 :(得分:0)

我建议您直接从查询中加载到dto对象中。它会避免这些类型的问题。

所以你的查询看起来像这样

返回(来自Session.Query()中的c 其中c.Id == cartId 选择新的CartModel {Amount = c.ArticleList.Count,CurrencyCode = c.Currency.Code,CartLines = c.ArticleList})。Single();

我猜测ArticleList是一个映射到Cart对象的集合。我会将BatchSize添加到该映射中,这样您就可以一次获取子项目。