代码之家  ›  专栏  ›  技术社区  ›  Adam Pope

从与Nhibernate连接的结果填充域对象的未映射属性

  •  1
  • Adam Pope  · 技术社区  · 16 年前

    我有一个情况,我有3个表:StockItem,Office和StockItemPrice。每间办公室的存货价格可能不同。

    StockItem(
      ID
      Name
    )
    
    Office(
      ID
      Name
    )
    
    StockItemPrice(
      ID
      StockItemID
      OfficeID
      Price
    )
    

    IList<StockItemPrice> Prices;
    

    其中包含了每个办公室的物品价格。很好用。现在我想知道一间办公室的价格。我有以下查询条件:

    NHibernateSession.CreateCriteria(persistentType)  
                     .Add(Restrictions.Eq("ID", id))  
                     .CreateAlias("Prices", "StockItemPrice")  
                     .Add(Restrictions.Eq("StockItemPrice.Office", office))  
                     .UniqueResult<StockItem>();  
    

    这看起来工作得很好,因为它生成的SQL是我所期望的。但是,我不知道它是否会流行 StockItem.Prices 只要我引用了一个对象,NHibernate就会执行所有办公室价格的延迟加载。此外,即使它真的起作用了,但通过使用以下方法来获取价格也会让人感觉非常粗糙:

    mystockitem.Prices[0].Price
    

    我真正想要的是有一个 Price

    我试着添加 .CreateCriteria("Price", "StockItemPrice.Price")

    NHibernate.QueryException : could not resolve property: Price of: StockItem
    

    如何调整查询以实现这一点?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Diego Mijelshon    16 年前

    如果您愿意从StockItemPrice中删除ID,那么可以使用 .

    按以下方式申报您的Prices房产:

    IDictionary<Office, decimal> Prices { get; set; }
    

    <map name="Prices" lazy="extra">
      <key column="StockItemID" />
      <map-key-many-to-many class="Office" column="OfficeId"/>
      <element type="Decimal" column="Price"/>
    </map>
    

    特别注意 lazy="extra"

    decimal priceInNY = item.Prices[nyOffice];
    

    只是价格 nyOffice (Office实例或代理)将从数据库中检索。

        2
  •  0
  •   David M    16 年前

    如果你有世界上所有办公室的价格 Prices 属性,为什么要返回数据库?

    public virtual StockItemPrice GetPriceForOffice(Office office)
    {
        return Prices
            .Where(p => o.Office.Equals(office))
            .SingleOrDefault();
    }