Как я могу выполнить идемпотентную строку вставки, используя subsonic с бэкэндом SQL 2008? - PullRequest
0 голосов
/ 18 марта 2010

Как я могу выполнить идемпотентную строку вставки, используя subsonic с бэкэндом SQL 2008?

, например

У меня есть таблица «Цвета», где имя является первичным ключом.

Color c = new Color;
c.name = "red";
c.Save;

Color c2 = new Color;
c2.name = "red";
c2.Save; // throws duplicate key error;

Я знаю, что могу просто перехватить ошибку, но я бы предпочел сделать что-то вроде REPLACE в MySql

Ответы [ 2 ]

1 голос
/ 24 марта 2010

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

Давайте немного подумаем о том, что нужно для проверки, если значение будет дубликатом в базе данных перед выполнением команды вставки ... 1. Вы должны будете выполнить SELECT для каждого столбца, который имеет уникальное ограничение, проверяющее его, у него уже есть значение, которое собирается вставить. 2. Если нет, выполните ВСТАВКУ. 3. Если да, бросить исключение? ... это именно то, что происходит сейчас ...

Итак, пусть это дует! :) Просто будьте готовы к тому, что он взорвется (оберните сохранение в Try / Catch) и действуйте соответственно.

Ура! Alex

1 голос
/ 23 марта 2010

Я не воспроизвел вашу проблему, поэтому у меня нет прямого ответа на вашу проблему, но ...

Использование строк в качестве PK не является хорошей практикой, почему бы вам не использовать его с первичным ключом INT плюс столбец Description Varchar? Отношения с этой таблицей будут намного быстрее, так как базы данных индексируют целое число намного быстрее, чем текст.

...