Вызов хранимой процедуры с использованием NHibernate в качестве именованного запроса с входными параметрами - PullRequest
2 голосов
/ 11 октября 2011

Описание проблемы:

Я пытаюсь выполнить хранимую процедуру с входным параметром. Хранимая процедура выполняется правильно при запуске из MSSQL 2008 SQL Studio. Однако я получаю сообщение об ошибке при запуске его в качестве именованного запроса с использованием NHibernate.

Я получаю ошибку во время конфигурации SessionFactory. Следовательно, я считаю, что я неправильно отображаю именованный запрос.

Детали хранимой процедуры:

Название процедуры : CASCADE_POSITIONTEMPLATE_PERMISSIONS
Входной параметр : PositionTemplateId

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

Отображение именованных запросов / классов:

Отображение именованных запросов:

    <hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2" 
assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
      <sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">
        <return class="PositionTemplateUpdateCascadeResult" alias="result">
          <return-property name="UpdatedPositionsCount">
            <return-column name="UpdatedPositionsCount" />
          </return-property>
        </return>
        exec CASCADE_POSITIONTEMPLATE_PERMISSIONS :PositionTemplateId
      </sql-query>
    </hibernate-mapping>

Ниже приведен класс, который я хочу вернуть:

public class PositionTemplateUpdateCascadeResult
{
    public int UpdatedPositionsCount { get; set; }
}

когда я выполняю процедуру в MSSQL Studio как:

   EXEC [CASCADE_POSITIONTEMPLATE_PERMISSIONS]  15

Я получаю следующее

enter image description here

Дайте мне знать, если что-то еще нужно.


РЕДАКТИРОВАТЬ: я смог сделать эту работу, когда я удалил класс возврата: Следующее отображение работает корректно:

<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2" 
    assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
<sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">            
      exec CASCADE_POSITIONTEMPLATE_PERMISSIONS :PositionTemplateId
</sql-query>
</hibernate-mapping>

Должен ли возвращаемый класс быть сущностью, которая отображается в таблицу? В моем случае это простой класс. Я придерживался мнения, что класс возврата используется так же, как мы используем ResultTransformer.

1 Ответ

1 голос
/ 11 октября 2011

Возможно, вы не правильно определили запрос в файле HBM.Попробуйте это:

<hibernate-mapping default-cascade="none" xmlns="urn:nhibernate-mapping-2.2"
  assembly="StudentVoiceGroups.Entities" namespace="StudentVoiceGroups.Entities" >
  <sql-query name="CASCADE_POSITIONTEMPLATE_PERMISSIONS" cacheable="false">
    <return alias="result" class="YourNamespace.PositionTemplateUpdateCascadeResult, YourNamspaceAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <return-property name="UpdatedPositionsCount" column="UpdatedPositionsCount" />
    </return>
    exec CASCADE_POSITIONTEMPLATE_PERMISSIONS @PositionTemplateId=?
  </sql-query>
</hibernate-mapping>

Это должно работать, потому что я использовал что-то похожее в своем ответе на этот вопрос SO.вернуть элемент , убедитесь, что вы указали полный тип возврата (включая полное имя сборки с правильным номером версии).

...