Что означает на плойке hi и lo

Обновлено: 03.05.2024


Как работает Hi/Lo

Может быть очень полезно (особенно с ORM), чтобы иметь возможность устанавливать первичные ключи на стороне клиента вместо того, чтобы вставлять значения без первичных ключей, а затем извлекать их обратно на клиент. Помимо всего прочего, это означает, что вы можете легко создавать отношения между родителями и дочерними элементами и иметь все ключи на месте, прежде чем делать какие-либо вставки, что упрощает их батчинг(batching).

Используем Hi/Lo для генерации ключей в Entity Framework Core

Давайте посмотрим, как использовать Hi/Lo для генерации ключей с помощью Entity Framework Core. Допустим у нас есть простая модель Категорий:


Помним что EF конфигурирует свойство Id или Id в качестве ключа. Теперь нам нужно создать DBContext:


DbContext состоит из:

  • конструктора SampleDBContext который представляет собой реализацию инициализатора базы данных DropCreateDatabaseAlways ;
  • метода OnConfiguring для настройки DBContext;
  • метода OnModelCreating — это место, где можно определить конфигурацию модели. Чтобы определить последовательность Hi/Lo, используйте метод расширения ForSqlServerUseSequenceHiLo .

ForSqlServerUseSequenceHiLo(string name, string schema) .



Данная последовательность начинается с 1 и увеличивается на 10. Существует разница между Sequence и Hi/Lo Sequence относительно опции INCREMENT BY . В Sequence INCREMENT BY добавляет значение к предыдущему значению последовательности, чтобы сгенерировать новое значение. Таким образом, в этом случае, если ваше предыдущее значение последовательности равно 11, тогда следующее значение последовательности будет равно 11 + 10 = 21. В случае Hi/Lo Sequence параметр INCREMENT BY обозначает значение блока, это означает, что следующее значение последовательности будет выбрано после использования первих 10.

Давайте добавим некоторые данные в базу:


Как только этот код попадает в строку, где добавляется категория в DBContext, выполняется вызов базы данных, чтобы получить значение последовательности. Это можно проверить его с помощью SQL Server Profiler.


Когда вызывается dataContext.SaveChanges(); все 3 категории будут сохранены с значениями первичного ключа которые уже сгенерированные и выбираются только один раз.


Значение последовательности не будет выбрано из базы данных пока не исчерпана часть Lo (10 записей в нашем случае), тольки при добавлении 11-ой записи будет выполняться вызов базы данных, чтобы получить следующее значение последовательности (Hi).

Можно создать одну последовательность нескольких таблиц:

Настройка последовательности Hi/Lo

В метода ForSqlServerHasSequence нет никаких параметров для изменения начального значения и значения инкременты. Но можно указать эти значения следующим образом, сначала определяем последовательность с параметрами StartAt и IncrementBy а дальше используем тот же метод расширения ForSqlServerUseSequenceHiLo .


В этом случае sql-скрипт для DBSequenceHiLo будет иметь следующий вид

Читайте также: