Geração de Valores do SQLite

Esta página detalha a configuração de geração de valor e os padrões específicos do fornecedor SQLite. Recomenda-se primeiro ler a página geral sobre geração de valor.

Colunas AUTOINCREMENT

Por convenção, as colunas de chave primária numéricas configuradas para terem os seus valores gerados na adição são configuradas com a funcionalidade AUTOINCREMENT do SQLite. A partir do EF Core 10, o SQLite AUTOINCREMENT também pode ser ativado ou desativado via configuração.

Configuração do AUTOINCREMENT

Por convenção, as chaves primárias inteiras são automaticamente configuradas com AUTOINCREMENT quando não fazem parte de uma chave composta e não têm uma chave estrangeira. No entanto, pode ser necessário configurar explicitamente uma propriedade para usar SQLite AUTOINCREMENT quando a propriedade tiver uma conversão de valor de um tipo não inteiro, ou ao sobrepor convenções:

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

Desativando o AUTOINCREMENT para a geração padrão de valores SQLite

O AUTOINCREMENT impõe sobrecarga extra de CPU, memória, espaço em disco e I/O de disco em comparação com o algoritmo padrão de geração de chaves no SQLite - ROWID. A desvantagem ROWID é que reutiliza valores de linhas apagadas. Se o teu cenário não for afetado por isto, podes querer desativar o AUTOINCREMENT e usar o comportamento padrão de geração de valor do SQLite. Pode fazer isto usando a API de Metadados:

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

Alternativamente, pode configurar o EF para não tratar a propriedade como gerada por valor:

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

Isto significa que cabe à aplicação fornecer um valor para a propriedade antes de guardar na base de dados. Note que isto ainda não desabilita a geração de valor padrão do lado do servidor, por isso os usos que não sejam EF podem continuar a obter um valor gerado. Para desativar completamente a geração de valor, altere o tipo de coluna de INTEGER para INT.