nhibernate: сопоставление классов без таблицы

У меня есть класс сущности, который я использую для представления результатов sql-запроса. Отображение для класса показано ниже. Тем не менее, насколько я могу судить, nhiberate рассматривает отображение, как если бы это была настоящая таблица базы данных - хотя на самом деле ее нет. В этом случае в базе данных нет ничего, что вообще представляло бы эту сущность. Я использую это для сопоставления запроса, но то же самое можно сказать и о представлении. Нет ли способа указать nhibernate, что нет таблицы, представленной отображением?

<class name="Models.UserTransaction"> <!-- Defaults table name same as Entity even though table doesn’t exist -->
  <id name="Id">
    <column name="Id" not-null="true" unique="true" />
    <generator class="native" />
  </id>
  <property name="TransType" />
  <property name="Date" />
  <property name="Amount" />
  <property name="Balance" />
</class>

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

  <sql-query name="UserTransactions">
    <query-param name="userId" type="string" />
    <return class="Models.UserTransaction" alias="userTx">
      <return-property name="TransType" column="TransType" />
      <return-property name="Id" column="Id" />
      <return-property name="Date" column="TransDate" />
      <return-property name="Amount" column="Amount" />
      <return-property name="Balance" column="Balance" />
    </return>
    <![CDATA[
      SELECT userTx.[Type] as TransType, userTx.[Id] as Id, userTx.[Date] as TransDate, userTx.[Amount] as Amount, userTx.[Balance] as Balance
      FROM dbo.User_AccountStatement(:userId) userTx
    ]]>
  </sql-query>

person Dale K    schedule 28.04.2012    source источник
comment
Если вы не хотите отображать свой класс в базу данных, тогда ... зачем вы его отображаете? :) просто удалите отображение полностью, скажите nHib, чтобы он не отображал его, и все   -  person J. Ed    schedule 30.04.2012
comment
Как говорится в вопросе, я хочу сопоставить его с результатами запроса, например, с отчетом, так что одностороннее сопоставление (например, от базы данных к приложению). Кажется неправильным для nhibernate думать, что относиться к нему как к двустороннему отображению, когда это не так.   -  person Dale K    schedule 30.04.2012
comment
Глядя на другую проблему с запросом, я еще раз подумал о вашей проблеме. Вы действительно ищете какой-нибудь ResultTransformer для SQL-запроса и DTO? Relations.to/Bloggers/   -  person jbl    schedule 02.05.2012
comment
@DaleBurrell: Я столкнулся с этой проблемой прямо сейчас. Имеет смысл иметь одностороннее отображение. ORM - это объектно-реляционный преобразователь. Это не означает, что поддерживаются вставки, обновления и удаления. Это инструмент сопоставления реляционных данных с объектно-ориентированными данными. Я действительно хочу, чтобы NHibernate разрешал только чтение / выбор сопоставлений для результатов запроса. Нам нужно загрузить данные из многих других таблиц, и создание представления для создания отчета является излишним для нашего сценария.   -  person Greg Burghardt    schedule 12.12.2016


Ответы (2)


Если у вас есть представление db, вы можете использовать nhibernate для сопоставления с ним, но если все, что вы делаете, это сохраняете поля проекции запроса, карта вообще не нужна.

Как вы запрашиваете эти данные?

если вы используете API критериев, вы можете использовать преобразователь результатов для сопоставления возвращенного массива объектов с вашим классом. типы должны соответствовать вашему классу и проекции.

если вы используете провайдер linq, вы можете проецировать прямо в свой класс. так что у вас будет что-то вроде этого

из s в Session.Query, где s.some-property == "some-value" выберите новый ваш-тип {some-property-on-your-type = s.some-property, some-other-property-on-your -type = s.some-other-property}

Нет необходимости писать сопоставление с базой данных, поскольку вы не сопоставляете объект в базе данных.

person Fran    schedule 30.04.2012
comment
Хорошо, я отредактировал свой вопрос, чтобы показать, что я использую sql-запрос, я не могу заставить его работать без сопоставления, но, может быть, именно здесь я ошибся? - person Dale K; 01.05.2012

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

Тогда вы сможете:

person jbl    schedule 30.04.2012
comment
Неважно, назовете ли вы его, потому что по умолчанию используется имя объекта. В противном случае вы правы, и это именно то, что я сделал, но мой вопрос: есть ли способ сообщить nhibernate, что это одностороннее отображение (см. Мой комментарий к моему вопросу), поскольку кажется неправильным, что nhibernate думает его два пути, когда его нет. Я наблюдал в файле журнала, как он генерировал для него оператор вставки. Первоначально он также генерировал обновление, но это было исправлено установкой mutable = false, которая была предложена в ответе, который, похоже, был удален. - person Dale K; 30.04.2012
comment
@DaleBurrell: пробовали ли вы превратить сопоставление идентификаторов в простое свойство с сопоставлением столбцов, сохраняя уникальное ограничение, с insert = false и update = false (и повторите обновление и вставьте части для всех других ваших свойств)? - person jbl; 30.04.2012