Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1211. #ЗаметкиНаПолях SQL Последовательности для Создания Уникальных Значений Для создания уникального номера, например заказа в системе продаж, вы можете: - использовать автогенерацию первичного ключа из базы данных, - выбирать максимальный номер заказа из базы и добавлять единицу, - использовать свой код, генерирующий уникальные числа. – использовать SQL-последовательность. Последовательность (sequence) - простой и эффективный способ создания уникальных упорядоченных значений потокобезопасным способом. SQL код для создания очень прост:
CREATE SEQUENCE TestSeq
START WITH 1
INCREMENT BY 1

Начальный номер и число инкремента могут быть любыми. Выбрать следующее значение можно так:
SELECT NEXT VALUE FOR TestSeq

Entity Framework также поддерживает последовательности… ну, более-менее. Создать последовательность можно в OnModelCreating вашего DbContext:
protected override void OnModelCreating(ModelBuilder mb)
{
  mb.HasSequence("TestSeq",
   x => x.StartsAt(1000).IncrementsBy(2));
  …

А вот простого метода получения следующего значения нет. Большинство документации сводится к использованию значения по умолчанию через вот такую конструкцию:
mb.Entity<Order>()
  .Property(o => o.OrderNo)
  .HasDefaultValueSql("NEXT VALUE FOR TestSeq");

Ограничения При принятии решения об использовании последовательностей, необходимо иметь в виду некоторые их ограничения: 1. Когда вы запрашиваете число, независимо от того, что происходит с этого момента, последовательность увеличивается. Последовательности не являются частью транзакций. Если вы откатите транзакцию с выбранным числом последовательности, это число «потеряется». 2. Последовательности не могут быть «разделены» каким-либо образом. Если вам требуется генерировать уникальные номера в течение года, а с 1 января «сбрасывать» нумерацию, вы не сможете создать заказ «задним числом». 1 января последовательность сбросится, и получить номер для заказа от 31 декабря прошлого года не удастся. Вариант решения – иметь несколько последовательностей на текущий год и несколько предыдущих, в которых ещё требуется продолжать нумерацию. 3. Аналогично если нескольким потребителям требуется отдельная нумерация, для каждого придётся создать свою последовательность. Итого Последовательности хороши, когда вам нужно приращение на одно и то же число для вашей базы данных с одним потребителем. Для более сложного функционала придётся придумывать что-то нестандартное или иметь дело с управлением несколькими последовательностями одновременно и выбором правильной в нужное время с помощью бизнес-логики. Источник: dotnetcoretutorials.com/2022/03…e-values