Обработка генерации неидентичного первичного ключа - PullRequest
4 голосов
/ 23 февраля 2011

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

Я думаю об обработке события SavingChanges ObjectContext для установки его значений.

(псевдокод)

void SavingChanges(context)
{
    foreach (var entity in context)
    {
        if (entity.HasIdentity) continue;

        entity.PrimaryKey = GetNextPrimaryKey(entity.Type);
    }
}

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

Будет ли это работать?Должен ли я попробовать что-то другое?

1 Ответ

0 голосов
/ 28 августа 2011

Это зависит от логики в методе GetNextPrimaryKey.

Если ваш метод выполняется в нескольких потоках, у вас будет шанс, что один и тот же ключ будет назначен нескольким объектам.

Buti, если ваш GetNextPrimaryKey продвигает ваш ключ и всегда возвращает новый ключ, независимо от того, используется он или нет, тогда проблем нет.

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

Лучше всего было бы использовать какую-то хранимую процедуру и всегда возвращать новый ключ из SP, поэтому в случае параллельного выполнения GetNextPrimaryKey проблем не возникнет.

...