Есть ли способ подделать столбец идентификатора в NHibernate? - PullRequest
3 голосов
/ 03 ноября 2008

Скажем, я отображаю простой объект в таблицу, содержащую дубликаты записей, и хочу разрешить дубликаты в моем коде. Мне не нужно обновлять / вставлять / удалять в этой таблице, только отображать записи.

Есть ли способ, которым я могу поместить столбец поддельных (сгенерированных) идентификаторов в моем файле отображения, чтобы обманом заставить NHibernate думать, что строки уникальны? Создание составного ключа не сработает, поскольку во всех столбцах могут быть дубликаты.

Если это невозможно, как лучше обойти эту проблему?

Спасибо!

Редактировать: Похоже, что это был путь к запросу

Ответы [ 2 ]

2 голосов
/ 04 ноября 2008

Отображение NHibernate предполагает, что вы хотите сохранить изменения, и, следовательно, требуется какой-то идентификатор.

Если вам разрешено изменять таблицу, вы можете добавить столбец идентификаторов (имя SQL Server - ваша база данных может отличаться) для автоматической генерации уникальных идентификаторов - существующий код не должен изменяться.

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

Другой альтернативой, которую я не пробовал, было бы сопоставить ваш класс с запросом SQL вместо таблицы. IIRC, NHibernate поддерживает именованные SQL-запросы в файле отображения, и вы можете использовать их в качестве «источника данных» вместо таблицы или представления.

0 голосов
/ 15 апреля 2009

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

ВЫБРАТЬ NEWGUID () в качестве идентификатора, * ИЗ ТАБЛИЦЫ

ID становится вашим уникальным первичным ключом. Как указано выше, это полезно только для представлений только для чтения. Поскольку идентификатор не имеет значения после запроса.

...