Генерация значений в SQLite

Эта страница содержит сведения о конфигурации создания значений и шаблонах, относящихся к поставщику SQLite. Рекомендуется сначала прочитать общую страницу по генерации значений.

Столбцы "AUTOINCREMENT"

По соглашению числовые столбцы первичного ключа, настроенные на автоматическое создание значений при добавлении, конфигурируются с помощью функции AUTOINCREMENT SQLite. Начиная с EF Core 10, SQLite AUTOINCREMENT также можно включить или отключить с помощью конфигурации.

Настройка AUTOINCREMENT

По соглашению целочисленные первичные ключи автоматически настраиваются с помощью AUTOINCREMENT, если они не являются частью составного ключа и не имеют внешнего ключа. Однако может потребоваться явно настроить свойство для использования SQLite AUTOINCREMENT, если свойство имеет преобразование значений из типа, отличного от целочисленного типа, или при переопределении соглашений:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Id)
        .HasConversion<int>()
        .UseAutoincrement();
}

Отключение AUTOINCREMENT для создания значений SQLite по умолчанию

AUTOINCREMENT накладывает дополнительные затраты на ЦП, память, место на диск и операции ввода-вывода диска по сравнению с алгоритмом создания ключей по умолчанию в SQLite — ROWID. ROWID Недостатком является то, что он повторно использует значения из удаленных строк. Если сценарий не будет затронут этим, вы можете отключить AUTOINCREMENT и использовать поведение создания значений по умолчанию SQLite. Это можно сделать с помощью API метаданных:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Id)
        .Metadata.SetValueGenerationStrategy(SqliteValueGenerationStrategy.None);
}

Кроме того, можно настроить EF, чтобы не рассматривать свойство как созданное значение:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Id)
        .ValueGeneratedNever();
}

Это означает, что приложение может предоставить значение свойства перед сохранением в базе данных. Обратите внимание, что это по-прежнему не отключает серверное создание значений по умолчанию, поэтому использование вне EF всё равно может получить сгенерированное значение. Чтобы полностью отключить создание значений, измените тип столбца на INTEGERINT.