Создать первичный ключ без идентификатора - PullRequest
2 голосов
/ 16 апреля 2010

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

К сожалению, для меня LINQ-TO-SQL оптимизирован с использованием столбцов идентификаторов. Поэтому мне нужно запрашивать и обновлять таблицу «NextId» всякий раз, когда я выполняю вставку. Для простоты я делаю это при создании нового объекта:

var db = new DataContext( "...connection string..." );
var car = Car
{
    Id = GetNextId<Car>( db ),
    TopSpeed = 88.0
};
db.InsertOnSubmit( car );
db.SubmitChanges();

Метод GetNextId выглядит примерно так:

* +1007 *

Поскольку все операции между созданием контекста данных и вызовом SubmitChanges являются частью одной транзакции, нужно ли создавать отдельный контекст данных для получения следующих идентификаторов? Каждый раз, когда мне нужен идентификатор, мне нужно запрашивать и обновлять таблицу внутри транзакции, чтобы несколько приложений не могли получить одно и то же значение. Вызов SubmitChanges () в методе GetNextId () отправит все предыдущие операции, что я не хочу делать.

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

...