2010-02-18 3 views
0

Из того, что я собираю, Linq to SQL фактически не выполняет никаких команд базы данных (включая открытие соединений с базой данных) до тех пор, пока не вызывается метод SubmitChanges(). Если это так, я хотел бы повысить эффективность нескольких методов. Возможно ли вернуть объект ID объекта перед его вставкой? Я бы предпочел не звонить SubmitChanges() дважды, если это возможно для меня знать значение идентификатора, прежде чем он фактически вставлен в базу данных. С логической точки зрения было бы целесообразно открыть соединение с базой данных, чтобы узнать значение, но также должна ли выполняться процедура вставки?Идентификатор объекта перед вставкой в ​​базу данных (Linq to SQL)

Благодаря

ответ

1

Обычная методика решения этого вопроса заключается в создании уникального идентификатора в прикладном уровне (например, GUID) и использовании его как ID. Таким образом, вам не нужно получать идентификатор при последующем вызове.

Конечно, использование GUID в качестве первичного ключа может иметь свои недостатки. Если вы решите пойти таким образом, посмотрите код COMB GUID.

+0

Благодарим за головок в GUID COMB. Я не сталкивался с ними, поэтому прочитаю. – keyboardP

0

Ну, вот в чем проблема: Вы как-то идентификатор, прежде чем вставлять в базу данных, и сделать некоторую обработку с ним. В то же время другой поток делает то же самое, и get имеет одинаковый идентификатор, у вас конфликт.

I.e. Я не думаю, что есть простой способ сделать это.

+0

У меня было ощущение, что это будет так. Есть ли способ открыть соединение с базой данных и зарезервировать идентификатор (как если бы он был взят), но фактически не выполнить вставку? Любые другие потоки будут видеть это как взятое и возвратить следующий свободный идентификатор. – keyboardP

0

Я не обязательно рекомендую это, но видел это. Вы можете вычислить свой собственный идентификатор как целое число с помощью хранимой процедуры и таблицы для хранения значения следующего идентификатора. Хранимая процедура выбирает значение из таблицы, чтобы вернуть ее, а затем увеличивает значение. Таблица будет выглядеть следующим

Create Table Keys(
name varchar(128) not null primary key, 
nextID int not null 
) 

вещей отметить, прежде чем делать это в том, что если вы выбираете, а затем обновить в 2-х разных партий у вас есть потенциальный ключ столкновения. Оба эти этапа нужно рассматривать как атомную транзакцию.

Смежные вопросы