Что означает на плойке 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 будет иметь следующий вид
Читайте также: