0

Когда я меняю OnlinePayment Я хочу создать уникальную цифру InvoiceNumber. Этот код будет генерировать уникальный идентификатор:Выполняет ли запрос внутри транзакции, гарантирует уникальность сгенерированного числа?

int newId = db.OnlinePayments.Max(op => op.InvoiceNumber) + 1; 

Однако, это не сработает, если другая запись добавляется в то же время. Использование столбца Identity не является вариантом, так как значение InvoiceNumber должно меняться при каждом изменении базы данных. Будет ли следующий код гарантировать уникальность сгенерированного InvoiceNumber?

using (var transaction = db.Database.BeginTransaction()) 
{ 
    try 
    { 
     int newId = db.OnlinePayments.Max(op => op.InvoiceNumber) + 1; 
     opi.InvoiceNumber = newId; 
     await db.SaveChangesAsync(); 

     transaction.Commit(); 
    } 
    catch 
    { 
     transaction.Rollback(); 
    } 
} 
+0

Немного неясно .... 'GUID'? 'Генератор случайных чисел (RNG)'? приходят на ум ... – EdSF

+0

Почему бы не использовать 'InvoiceNumber' в качестве столбца идентификации? –

+1

@ArindamNayak Я считаю, что ответил на ваш вопрос выше. –

ответ

0

Нет, поскольку две транзакции могут считывать одно и то же максимальное значение, а затем оба используют это значение плюс один.

+0

Итак, как я могу это сделать? –

+0

Я не могу найти хороший канонический вопрос прямо сейчас. Может быть, вы должны спросить об этом. Msgstr "Как сгенерировать непрерывные последовательные идентификаторы с Entity Framework?". – usr

+0

Да Мне нужны последовательные идентификаторы, но я хочу, чтобы они менялись всякий раз, когда я изменяю запись. Как я сказал Мартину выше, если есть запись с 'Id'' 1' и 'InvoiceNumber'' 10'. Теперь, когда я меняю эту запись, 'InvoiceNumber' должен измениться на нечто вроде' 11'. –

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