如何使用nhibernate调用存储过程?

时间:2012-05-13 13:27:43

标签: nhibernate stored-procedures nhibernate-mapping

我对它进行了研究,并且所有解决方案都指出了一个解决方案,使用下面的代码释放并将其放在.hbm.xml文件中。但我没有。我所拥有的是hibernate.cfg.xml和nhvalidator.cfg.xml。

我从这里读到:http://forums.asp.net/t/1407518.aspx/1 但我在哪里可以输入查询标签?我在hibernate.cfg.xml中输入了它(见下文),但它无效。

<?xml version="1.0" encoding="utf-16"?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="connection.connection_string">Server=localhost\MSSQLSERVERR2;Database=SupplierSearch;Trusted_Connection=True</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
        <property name="cache.use_minimal_puts">false</property>
        <property name="use_outer_join">false</property>
    </session-factory>
   <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  namespace="Quarry.SupplierSearch"
  assembly="SupplierSearch">
    <class name="SupplierSearch" table="Client" lazy="true">
      <id name="ClientId" column="ClientId">
        <generator class="native" />
      </id>

      <property name="FirstName" column="FirstName" />
      <property name="ClientId" column="ClientId" />

      <loader query-ref="GetAllClient"/>
    </class>
    <sql-query name="GetAllClient" >
      <return alias="GetAllClient" class="SupplierSearch">
        <return-property name="ClientId" column="ClientId"/>
        <return-property name="FirstName" column="FirstName"/>
      </return>
      exec GetAllClient 
    </sql-query>
  </hibernate-mapping>
</hibernate-configuration>

因为它无法正常工作,我尝试在客户端映射的Client.nhv.xml(见下文)中输入它。

<?xml version="1.0" encoding="utf-8"?>
<nhv-mapping assembly="Quarry.SupplierSearch" namespace="Quarry.SupplierSearch.Model" xmlns="urn:nhibernate-validator-1.0">
    <class name="Client">
        <property name="Address1">
            <not-null />
        </property>
        <property name="Address2">
            <not-null />
        </property>
        <property name="BusinessName">
            <not-null />
        </property>
        <property name="ClientId">
            <not-null />
            <digits integerDigits="10" />
        </property>
        <property name="Country">
            <not-null />
        </property>
        <property name="FirstName">
            <not-null />
        </property>
        <property name="LastName">
            <not-null />
        </property>
        <property name="ListingType">
            <not-null />
            <digits integerDigits="10" />
        </property>
        <property name="PhoneNumber">
            <not-null />
        </property>
        <property name="PostCode">
            <not-null />
        </property>
        <property name="State">
            <not-null />
        </property>
    </class>
  <loader query-ref="GetAllClient"/>
  <sql-query name="GetAllClient">
    <load-collection alias="Clients" role ="Client"/>
    exec [GetAllClient] 
  </sql-query>
</nhv-mapping>

任何建议让这个工作?感谢

2 个答案:

答案 0 :(得分:1)

需要将其称为Client.hbm.xml而不是Client.hbv.xml和嵌入资源。

编辑我不熟悉生成hbv的任何工具,也不会看到以<nhv-mapping .. >开头的映射。必须有一个自定义插件/ DLL才能使其正常工作。你用的是什么工具?

但是你有没有看到这个blog post让SP在没有任何自定义工具的情况下工作。

答案 1 :(得分:1)

load-collection不支持使用存储过程(仅限标量)。 使用格式:

<sql-query name="GetAllClient">
    <load-collection alias="Clients" role ="Client"/>
    SELECT {c.*}
    FROM client c
</sql-query>

(用你存储的proc内容中的东西代替“SELECT ... FROM ...”部分当然。)