Возможно ли иметь составной идентификатор, который можно редактировать в NHibernate?

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

В худшем случае бизнес-логика требует, чтобы они были изменяемыми.

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

Это устаревшая система, поэтому структура db не меняется (это ужасно).

Могу ли я что-нибудь сделать с помощью nhibernate, чтобы решить эту проблему? позволяет ли nhibernate даже изменять свои ключи.

Я использую: .net4.0, nhibernate 2.1, fluentnh 1.0 и sql server в качестве бэкэнда.


person Dovix    schedule 19.06.2010    source источник


Ответы (2)


Вы не можете изменить ПК с помощью NHibernate. Как вы уже поняли, структура, с которой вы имеете дело, просто ужасна.

Что вы можете сделать, так это использовать SQL-запросы для изменения PK. Имейте в виду, что вам придется перезагрузить объект с новым идентификатором, прежде чем использовать его снова.

person Diego Mijelshon    schedule 19.06.2010
comment
Я надеялся, что мне не хватало чего-то, что я мог бы сказать nhibernate, как с этим справиться :(. Я думал об использовании пользовательского sql для обработки изменений, но тогда это просто побеждает пурпурный цвет nh. Самое печальное то, что почти каждая таблица есть такая настройка и нет суррогатных ключей. У меня тоже был такой хороший домен ... вздох. Я просто собираюсь использовать linq2sql, чтобы все заработало. Спасибо за помощь, diego. - person Dovix; 20.06.2010

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

У меня есть приложение с объектной структурой, которая на самом деле не может быть представлена ​​в базе данных с NHibernate, понимающим семантику: для этого потребуется составной идентификатор из 3 столбцов, но уловка в том, что есть случаи, когда изменяются 2 столбца. Итак, я сопоставил одно свойство столбца как PK и автоматизировал использование двух других и получил лучшее из двух миров.

Обратите внимание, что в этих случаях кеширование 2-го уровня является большим запретом!

person Jaguar    schedule 19.06.2010
comment
Я пробую этот подход, и, похоже, он работает нормально. Однако с тех пор существует только 1 первичный ключ. Обновления сущности будут отправлять обновления для всех строк, а не только для той строки, которой действительно соответствует сущность. Таким образом, это будет сгенерировано UPDATE accountAccess SET access = 400 WHERE user = 1 вместо UPDATE accountAccess SET access = 400 WHERE user_id = 1 и accoun_id = 2. Сначала обновляются все элементы доступа к учетной записи пользователя, что неверно. Второй правильный. Спасибо за помощь, приятель. - person Dovix; 20.06.2010