NHibernate: хранимая процедура и компонент - PullRequest
3 голосов
/ 24 августа 2011

Я вызываю хранимую процедуру как NamedQuery, и она работает хорошо. Проблемы начинаются, когда я пытаюсь загрузить компонент. Хранимая процедура возвращает набор записей, подобный этому

[IDEmployee, EmployeeName, город, страна]

Если IDEmployee и EmployeeName принадлежат сопоставленной сущности, а город и страна относятся к компоненту

А вот и карта:

<class name="Employee" table="employees"> 
    <id name="IDEmployee"> 
      <column name="idemployee" /> 
      <generator class="native" /> 
    </id> 
    <property name="EmployeeName "> 
      <column name="employeename" /> 
    </property> 
    <component name="Address" class="Address"> 
      <property name="City"> 
        <column name="city" /> 
      </property> 
      <property name="Country"> 
        <column name="country" /> 
      </property> 
    </component> 
  </class> 

Это код, который я использую для вызова хранимой процедуры:

  <sql-query name="GetEmployeesByCompany"> 
    <return class="Employee"> 
      <return-property column="idemployee" name="IDEmployee" /> 
      <return-property column="employeename" name="EmployeeName" /> 
      <return-property column="city" name="City" /> 
      <return-property column="country" name="Country" /> 
    </return> 
    EXEC GetEmployeeByCompany:idcompany 
  </sql-query> 

Вот код, который я использую для вызова хранимого:

 var result = 
    session<ISession>().GetNamedQuery("GetEmployeesByCompany") 
                .SetInt32("idcompany", companyId) 
                .List<Employee>().ToList(); 

Вот ошибка, которую я получаю, когда запускаю свое приложение

System.IndexOutOfRangeException: t1_282_0_ 
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) 
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) 
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs:line 236 
   at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session)
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2508
   at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, String rowIdAlias, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session) 
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 991 

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

Любой совет? Спасибо!

1 Ответ

5 голосов
/ 24 августа 2011

В последнее время мне приходилось сталкиваться с этой проблемой, вот как я мог выйти.

<sql-query name="GetEmployeesByCompany">
  <return class="Employee">
    <return-property column="idemployee" name="IDEmployee" />
    <return-property column="employeename" name="EmployeeName" /> 
    <return-property name="Address">  <!-- name of the component -->
      <return-column name="city" />  <!-- name of the resultset field -->
      <return-column name="country" />  <!-- name of the resultset field -->
    </return-property>
</return> 
EXEC GetEmployeeByCompany:idcompany 

Порядок, который вы используете для полей внутри свойства return, очень важендолжен совпадать с тем в наборе результатов.Вокруг нет никакой документации, надеюсь, это поможет вам!

...