【问题标题】:Fetching data using NHibernate with Automapper使用 NHibernate 和 Automapper 获取数据
【发布时间】:2013-09-22 08:32:07
【问题描述】:

在我的销售过程中,我使用 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();
  }

【问题讨论】:

    标签: c# nhibernate automapper


    【解决方案1】:

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

    【讨论】:

    • 是的,我知道。我在 nHibernate 中启用了延迟加载,因此在调用 automapper 时会获取数据。但是这样可以吗,自动映射器运行查询?
    • 这取决于,如果你总是使用自动映射器来映射对象和子对象,那么延迟加载它没有任何意义......正如我所说,将其定义为不延迟,否则你'将简单地运行太多查询来检索您的对象...或者,如果您不需要调用新查询的子属性,请不要自动映射它们...
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您是否认为在将实体属性 ftlatting 到 dto 时使用 nhibernate 延迟加载通常是一种不好的做法?
    • 我不会这么说的。当我使用 NHibernate 进行开发时,我会记录我所有的 SQL 语句以查看 NHibernate 在幕后所做的事情。这告诉我是否需要更改映射以添加 Fetch 或 BatchSizes。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2015-09-17
    • 1970-01-01
    • 2020-12-30
    • 2016-04-19
    相关资源
    最近更新 更多