Альтернативы использованию Max + 1 для создания удобных уникальных порядковых номеров
У меня есть метод репозитория в моем веб-приложении asp.net mvc, чтобы автоматически генерировать уникальный порядковый номер с именем Tag: -
public void InsertOrUpdateServer(TMSServer server, string username)
{
if (server.TMSServerID == default(int))
{
// New entity
int technologyypeID = GetTechnologyTypeID("Server");
Technology technology = new Technology
{
IsDeleted = true,
Tag = "S" + GetTagMaximumeNumber(technologyypeID).ToString(),
StartDate = DateTime.Now,
};
Save();
//code goes here
Где функция GetTagMaximumeNumber ():
public int GetTagMaximumeNumber(int typeID) {
string s = tms.Technologies.Where(a => a.TypeID == typeID).Max(a2 => a2.Tag.Substring(1));
if (s != null)
{
return Int32.Parse(s) + 1;
}
else {
return 100;//if this is the first record created
}}
Выше будет получено максимальное количество тегов и добавлено 1, а затем попытаться сохранить его в базе данных. Вышеописанное работает хорошо, но я уверен, что на рабочем сервере, где несколько пользователей будут добавлять записи, будут сгенерированы одинаковые номера тегов, и возникнет исключение при попытке добавить автоматически созданный номер тега, который уже существует в базе данных. Итак, у меня есть следующие вопросы: -1
Каковы другие подходы, которым я могу следовать, чтобы иметь порядковый номер, который всегда уникален.
В моем текущем подходе пробелы в номере тега минимальны. Разрыв возникает только тогда, когда пользователь удаляет запись, а ее номер тега не был максимальным. Так есть ли способ сохранить это в любом новом подходе, чтобы пробелы были минимальными?
Спасибо за помощь.