Мне нужно написать строку в базе данных независимо от того, существует она уже или нет. Перед использованием NHibernate это было выполнено с помощью хранимой процедуры. Процедура будет пытаться обновить, и если никакие строки не будут изменены, она будет отбрасываться на вставку. Это хорошо работает, потому что приложение не заботится о том, существует ли запись.
В NHibernate найденные решения требуют загрузки объекта и его модификации или удаления объекта, чтобы новый можно было вставить. Приложение действительно заботится о том, что запись уже существует. Есть ли способ обойти это?
Имеет ли значение Id?
Назначенный идентификатор
Объект имеет ключевое слово в качестве назначенного идентификатора и является основным ключом в таблице.
Я понимаю, что SaveOrUpdate() вызовет метод Save() или Update(), если это необходимо на основе Id. Используя назначенный идентификатор, это не будет работать, потому что id не является несохраненным значением. Однако вместо этого в качестве индикатора можно использовать поле Version или Timestamp. В действительности это не актуально, поскольку это отражает только то, связан ли объект в памяти с записью в базе данных; он не указывает, существует ли запись в базе данных или нет.
Сгенерированный идентификатор
Если назначенный идентификатор действительно был причиной проблемы, я мог бы использовать сгенерированный идентификатор вместо ключевого слова в качестве первичного ключа. Это позволит избежать проблемы вставки/обновления NHibernate, так как она всегда будет всегда вставляться. Тем не менее, мне по-прежнему необходимо предотвратить дублирование ключевых слов. С уникальным индексом в столбце ключевых слов он все равно будет генерировать исключение для повторяющегося ключевого слова, даже если первичный ключ отличается.
Другой подход?
Возможно, проблема не в NHibernate, а в том, как это моделируется. В отличие от других областей приложения, это больше ориентировано на данные, а скорее объектно-ориентированное. Приятно, что NHibernate упрощает чтение/запись и устраняет хранимые процедуры. Но стремление просто писать без учета существующих значений не вполне соответствует модели модели идентичности объекта. Есть ли лучший способ приблизиться к этому?