在我的销售过程中,我使用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();
}
答案 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添加到该映射中,这样您就可以一次获取子项目。