0

在我的销售过程中,我使用 automapper 将 Cart 实体映射到 CartModel。购物车实体包含货币实体女巫应映射到 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));

购物车服务:

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

 return dto;
}

购物车存储库:

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

2 回答 2

0

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

于 2013-09-22T09:12:26.613 回答
0

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

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

return (从 c in Session.Query() where c.Id == cartId select new CartModel { Amount = c.ArticleList.Count, CurrencyCode = c.Currency.Code, CartLines = c.ArticleList}).Single();

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

于 2013-09-23T15:09:33.453 回答