Generowanie wartości SQLite

Ta strona zawiera szczegóły konfiguracji generowania wartości i wzorców specyficznych dla dostawcy SQLite. Zaleca się najpierw przeczytanie strony ogólnej generowania wartości.

KOLUMNY AUTOINCREMENT

Zgodnie z konwencją kolumny klucza głównego, które są skonfigurowane do generowania wartości przy dodaniu, są ustawione z użyciem funkcji AUTOINCREMENT SQLite. Począwszy od programu EF Core 10, funkcja AUTOINCREMENT SQLite może być również włączona lub wyłączona za pośrednictwem konfiguracji.

Konfigurowanie AUTOINCREMENT

Zgodnie z konwencją klucze podstawowe liczby całkowite są automatycznie konfigurowane za pomocą funkcji AUTOINCREMENT, gdy nie są częścią klucza złożonego i nie mają na nich klucza obcego. Jednak może być konieczne jawne skonfigurowanie właściwości w celu używania funkcji AUTOINCREMENT SQLite, gdy właściwość ma konwersję wartości z typu innego niż liczba całkowita lub podczas zastępowania konwencji:

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

Wyłączanie funkcji AUTOINCREMENT dla domyślnego generowania wartości SQLite

Funkcja AUTOINCREMENT nakłada dodatkowe obciążenie CPU, pamięci, miejsca na dysku i operacji wejścia/wyjścia w porównaniu z domyślnym algorytmem generowania kluczy w SQLite — ROWID. Wadą ROWID jest ponowne użycie wartości z usuniętych wierszy. Jeśli twój scenariusz nie będzie miał na to wpływu, możesz wyłączyć funkcję AUTOINCREMENT i zamiast tego użyć domyślnego zachowania generowania wartości SQLite. Można to zrobić przy użyciu interfejsu API metadanych:

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

Alternatywnie można skonfigurować program EF tak, aby nie traktować właściwości jako wygenerowanej wartości:

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

Oznacza to, że aplikacja musi podać wartość właściwości przed zapisaniem w bazie danych. Należy pamiętać, że nadal nie spowoduje to wyłączenia domyślnego generowania wartości po stronie serwera, więc użycie inne niż EF może nadal uzyskać wygenerowaną wartość. Aby całkowicie wyłączyć generowanie wartości, zmień typ kolumny z INTEGER na INT.