使用带有自动映射器的 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();
}
它实际上应该取决于您如何为 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 个子项目。