Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa pagina descrive in dettaglio la configurazione e i modelli di generazione di valori specifici per il provider SQLite. È consigliabile leggere prima la pagina generale sulla generazione del valore.
Colonne AUTOINCREMENT (funzione specifica in SQL)
Per convenzione, le colonne chiave primaria numeriche configurate per avere i loro valori generati all'aggiunta vengono impostate con la funzionalità AUTOINCREMENT di SQLite. A partire da EF Core 10, SQLite AUTOINCREMENT può anche essere abilitato o disabilitato tramite la configurazione.
Configurazione di AUTOINCREMENT
Per convenzione, le chiavi primarie integer vengono configurate automaticamente con AUTOINCREMENT quando non fanno parte di una chiave composita e non dispongono di una chiave esterna. Tuttavia, potrebbe essere necessario configurare in modo esplicito una proprietà per l'uso di SQLite AUTOINCREMENT quando la proprietà ha una conversione di valori da un tipo non integer o quando si eseguono l'override delle convenzioni:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Id)
.HasConversion<int>()
.UseAutoincrement();
}
Disabilitazione di AUTOINCREMENT per la generazione di valori SQLite predefinita
AUTOINCREMENT impone un sovraccarico aggiuntivo di CPU, memoria, spazio su disco e I/O su disco rispetto all'algoritmo di generazione di chiavi predefinito in SQLite - ROWID. Lo svantaggio di ROWID è che riutilizza i valori dalle righe eliminate. Se lo scenario non è interessato da questo problema, è possibile disabilitare AUTOINCREMENT e usare invece il comportamento di generazione dei valori predefinito di SQLite. A tale scopo, è possibile usare l'API metadati:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Id)
.Metadata.SetValueGenerationStrategy(SqliteValueGenerationStrategy.None);
}
In alternativa, è possibile configurare Entity Framework per non considerare la proprietà come generata dal valore:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Id)
.ValueGeneratedNever();
}
Ciò significa che spetta all'applicazione fornire un valore per la proprietà prima di salvare nel database. Si noti che questo non disabiliterà ancora il lato server di generazione di valori predefinito, quindi gli utilizzi non di Entity Framework potrebbero comunque ottenere un valore generato. Per disabilitare completamente la generazione di valori, modificare il tipo di colonna da INTEGER a INT.