Правильное отображение NHibernate для хранимой процедуры? - PullRequest
1 голос
/ 18 августа 2010

ОБНОВЛЕНИЕ: теперь это решено, см. Ответ ниже.


У меня возникли некоторые проблемы при попытке найти правильный способ написания NHibernateФайл отображения (.hbm.xml) для хранимой процедуры MSSQL.

Хранимая процедура принимает два параметра и возвращает набор результатов из одной строки, содержащий несколько столбцов с целочисленными значениями.

Мой файл отображениявыглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="TestApp.DataAccess"
                   namespace="TestApp.DataAccess.Models">

  <class name="MonthlyInstructionCount" lazy="true">
    <id name="Id" column="Month">
      <generator class="native" />
    </id>

    <property name="Month" />
    <property name="MapRequests" />
    <property name="Instructions" />
    <property name="DrainsLookSee" />
    <property name="DrainsFullCctv" />
    <property name="Soils" />
    <property name="Roots"/>
    <property name="Arb" />

    <loader query-ref="MI_MonthlyInstructionCount"/>
  </class>

  <sql-query name="MI_MonthlyInstructionCount">
    <return class ="MonthlyInstructionCount">
      <return-property name="Month" column="Month" />
      <return-property name="MapRequests" column="MapRequests" />
      <return-property name="Instructions" column="Instructions" />
      <return-property name="DrainsLookSee" column="DrainsLookSee" />
      <return-property name="DrainsFullCctv" column="DrainsFullCctv" />
      <return-property name="Soils" column="Soils" />
      <return-property name="Roots" column="Roots" />
      <return-property name="Arb" column="Arb" />
    </return>
    exec dbo.MI_MonthlyInstructionCount :StartDate :NumberOfMonths
  </sql-query>

</hibernate-mapping>

Я также попробовал следующее, как это было предложено кем-то на форуме для решения аналогичной проблемы, с которой сталкивался другой человек в отношении хранимых процедур ...

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="TestApp.DataAccess"
                   namespace="TestApp.DataAccess.Models">

  <sql-query name="MI_MonthlyInstructionCount">
    <return class ="MonthlyInstructionCount" />
    exec dbo.MI_MonthlyInstructionCount :StartDate :NumberOfMonths
  </sql-query>

</hibernate-mapping>

Кажется, ничего из этого не работает ... Я просто получаю следующую ошибку:

Инициализатор типа для 'TestApp.DataAccess.Sql.NHibernateHelper' вызвал исключение.

{«Ошибки в именованных запросах: {MI_MonthlyInstructionCount}»}

Я не вижу, чтобы это была хранимая процедура (хотя из-за ошибки можно предположить, что это ...), так как, кажется, она успешно работает в MSSQLсерверМенеджер.

Любая помощь очень ценится!Ура!

1 Ответ

3 голосов
/ 19 августа 2010

РЕШЕНО: Я решил эту проблему.Прежде всего, была проблема, когда свойство ID было установлено в «name = Id» вместо «name = Month».Во-вторых, мне пришлось обернуть команду exec в CDATA, а также поставить запятую между параметрами.Ниже приведен полный рабочий файл сопоставления для использования в будущем для тех, кто столкнулся с подобной проблемой.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="TestApp.DataAccess"
                   namespace="TestApp.DataAccess.Models">

  <class name="MonthlyInstructionCount" lazy="true">
    <id name="Month">
      <generator class="native" />
    </id>

    <property name="MapRequests" />
    <property name="Instructions" />
    <property name="DrainsLookSee" />
    <property name="DrainsFullCctv" />
    <property name="Soils" />
    <property name="Roots"/>
    <property name="Arb" />

    <loader query-ref="MI_MonthlyInstructionCount"/>
  </class>

  <sql-query name="MI_MonthlyInstructionCount">
    <return class="MonthlyInstructionCount">
      <return-property name="Month" column="Month" />
      <return-property name="MapRequests" column="MapRequests" />
      <return-property name="Instructions" column="Instructions" />
      <return-property name="DrainsLookSee" column="DrainsLookSee" />
      <return-property name="DrainsFullCctv" column="DrainsFullCctv" />
      <return-property name="Soils" column="Soils" />
      <return-property name="Roots" column="Roots" />
      <return-property name="Arb" column="Arb" />
    </return>
    <![CDATA[ 
    exec MI_MonthlyInstructionCount :StartDate, :NumberOfMonths
    ]]>
  </sql-query>

</hibernate-mapping>

Приветствия!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...