Entiy Framework и "правильный" primary key
От: VintVV Россия  
Дата: 24.08.09 17:50
Оценка:
Задача кажется довольно простая, но я ни как не могу сделать....

Есть таблица в БД, у нее один 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 >= значению генератора, ведь вставлять может не только данная прога

ПОМОГИТЕ!
entiy framework автоинкремент
Re: Entiy Framework и "правильный" primary key
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.08.09 03:36
Оценка: 1 (1)
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Entiy Framework и "правильный" primary key
От: SteckInc  
Дата: 25.08.09 05:38
Оценка: 1 (1)
Здравствуйте, 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?
Когда кому-то придется менять структуру таблиц или мерждить несколько баз, то скажут спасибо.
Re: Entiy Framework и "правильный" primary key
От: stump http://stump-workshop.blogspot.com/
Дата: 25.08.09 16:00
Оценка: 65 (2)
Здравствуйте, VintVV, Вы писали:

Попробуй StoreGeneratedPattern="Computed" для этого поля.
Понедельник начинается в субботу
Re[2]: Entiy Framework и "правильный" primary key
От: VintVV Россия  
Дата: 26.08.09 04:32
Оценка:
Здравствуйте, stump, Вы писали:

S>Здравствуйте, VintVV, Вы писали:


S>Попробуй StoreGeneratedPattern="Computed" для этого поля.


Спасибо. Реально очень помогло...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.