使用带有自动映射器的 NHibernate 获取数据

本文关键字:NHibernate 获取 数据 映射 | 更新日期: 2023-09-27 18:32:22

在我的销售过程中,我使用自动映射器将购物车实体映射到CartModel中。购物车实体包含货币实体女巫应映射到货币代码字符串。我有一个问题,应该是 nHibernate 在存储库方法上显式获取的货币实体,或者当我将其保留在我的映射规则中时,这没关系?什么是最好的解决方案?

老实说,我认为自动映射器不应该将查询发送到数据库中,我是对的?

映射:

 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();
  }

使用带有自动映射器的 NHibernate 获取数据

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

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

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

返回(来自 Session.Query() 中的 c)其中 c.Id == 购物车 ID选择 new CartModel { Amount = c.ArticleList.Count, CurrencyCode = c.Currency.Code, CartLines = c.ArticleList})。单();

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