Задача кажется довольно простая, но я ни как не могу сделать....
Есть таблица в БД, у нее один PK = ID, в тригере на befor insert в эту таблицу поставлен
автоинкремент поля ID. Триггер:
CREATE OR ALTER TRIGGER MODULE_BI FOR MODULE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_MODULE IS NULL) THEN
NEW.ID_MODULE = GEN_ID(GEN_MODULE_ID,1);
END
Сделал маппинг таблицы в EF, вызываю статический метод ObjectContext для создания
данного объекта, а он зараза требует ID.... но как я узнаю текущее значение генератора
для определения этого уникального ID.
Можно было бы конечно взять максимальный ID из всего набора и для нового элемента увеличивать его,
но где гарантия что этот ID >= значению генератора, ведь вставлять может не только данная прога
ПОМОГИТЕ!
Здравствуйте, VintVV, Вы писали:
VVV>Задача кажется довольно простая, но я ни как не могу сделать....
VVV>Есть таблица в БД, у нее один PK = ID, в тригере на befor insert в эту таблицу поставлен
VVV>автоинкремент поля ID. Триггер:
VVV>CREATE OR ALTER TRIGGER MODULE_BI FOR MODULE
VVV>ACTIVE BEFORE INSERT POSITION 0
VVV>AS
VVV>BEGIN
VVV> IF (NEW.ID_MODULE IS NULL) THEN
VVV> NEW.ID_MODULE = GEN_ID(GEN_MODULE_ID,1);
VVV>END
VVV>Сделал маппинг таблицы в EF, вызываю статический метод ObjectContext для создания
VVV>данного объекта, а он зараза требует ID.... но как я узнаю текущее значение генератора
VVV>для определения этого уникального ID.
VVV>Можно было бы конечно взять максимальный ID из всего набора и для нового элемента увеличивать его,
VVV>но где гарантия что этот ID >= значению генератора, ведь вставлять может не только данная прога
VVV>ПОМОГИТЕ!
Может быть, применить такой трюк:
1. Исправить триггер вот так:
CREATE OR ALTER TRIGGER MODULE_BI FOR MODULE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_MODULE IS NULL) OR (NEW.ID_MODULE < 0) THEN
NEW.ID_MODULE = GEN_ID(GEN_MODULE_ID,1);
END
2. В программе использовать "локальный генератор ID", который начинает с -1 и дальше уменьшает номера
вниз.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Здравствуйте, VintVV, Вы писали:
VVV>Задача кажется довольно простая, но я ни как не могу сделать....
VVV>Есть таблица в БД, у нее один PK = ID, в тригере на befor insert в эту таблицу поставлен
VVV>автоинкремент поля ID. Триггер:
VVV>CREATE OR ALTER TRIGGER MODULE_BI FOR MODULE
VVV>ACTIVE BEFORE INSERT POSITION 0
VVV>AS
VVV>BEGIN
VVV> IF (NEW.ID_MODULE IS NULL) THEN
VVV> NEW.ID_MODULE = GEN_ID(GEN_MODULE_ID,1);
VVV>END
VVV>Сделал маппинг таблицы в EF, вызываю статический метод ObjectContext для создания
VVV>данного объекта, а он зараза требует ID.... но как я узнаю текущее значение генератора
VVV>для определения этого уникального ID.
VVV>Можно было бы конечно взять максимальный ID из всего набора и для нового элемента увеличивать его,
VVV>но где гарантия что этот ID >= значению генератора, ведь вставлять может не только данная прога
VVV>ПОМОГИТЕ!
Если значения инкрементируются всеми прогами, которые пишут в таблицу, то можно завести отрицательное "магическое" число,
на которое и проверять в триггере.
Кроме того, если есть возможность, то может быть стоит сделать PK типа UNIQUEIDENTIFIER?
Когда кому-то придется менять структуру таблиц или мерждить несколько баз, то скажут спасибо.
Здравствуйте, stump, Вы писали:
S>Здравствуйте, VintVV, Вы писали:
S>Попробуй StoreGeneratedPattern="Computed" для этого поля.
Спасибо. Реально очень помогло...