另一个NHibernate映射之谜!在hbm文件中计数

时间:2013-06-03 08:10:30

标签: nhibernate nhibernate-mapping hbm

我正在尝试检索分配给hbm文件中容器的项目数。我已经完成了一些挖掘并设法获得我的hbm代码(下面!)。我希望每次查询容器对象时都会检索计数。我可以使用拦截器,但我认为有更好的方法。我是在正确的轨道上还是应该使用不同的策略来计算数量?

感谢。

P.S。我们正在使用NH v2.2

   <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="MyEntities" namespace="Entities.Containers">   <class name="Container" table="[Container]" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="Id" type="Int32" unsaved-value="0">
      <generator class="native" />
    </id>
    <property name="Capacity" column="Capacity">
      <column name="Capacity" />
    </property>
    <property name="Description" column="Description" length="50" type="String">
      <column name="Description" />
    </property>
    <loader query-ref="sqCurrentContainerAllocation"/>   </class>

  <sql-query name="sqCurrentContainerAllocation">
    <return-scalar column="AllocatedItemsCount" type="int"></return-scalar>
      SELECT COUNT(*) FROM [ContainerTracking]
      WHERE [ContainerId] = :Id   </sql-query> 
   </hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

如果您需要获取某些计算属性,可以使用formula映射。 让我们扩展您的C#类:

public class Container
{
  ... // ID, Capacity, Description
  public virtual int MyCount { get; set; }

并扩展您的映射

<class name="Container" table="[Container]"
  ...
  <property name="MyCount" insert="false" update="false" >
      <formula>
      (
         SELECT count(*) 
         FROM [ContainerTracking] as ct
         WHERE ct.[ContainerId] = Id
      )
      </formula>
  </property> 

Id将替换为'_this.Id'之类的思考,列ID的名称及其别名

这当然会一直加载计数(除了投影),所以在使用之前要三思而后