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