このページでは、SQLite プロバイダーに固有の値生成の構成とパターンについて詳しく説明します。 最初に 、値の生成に関する一般的なページを読み取うことをお勧めします。
AUTOINCREMENT(オートインクリメント)列
慣例により、追加時に値が生成されるように構成された数値主キー列は、 SQLite の AUTOINCREMENT 機能を使用して設定されます。 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();
}
既定の SQLite 値の生成に対する AUTOINCREMENT の無効化
AUTOINCREMENT では、SQLite - ROWID の既定のキー生成アルゴリズムと比較して、CPU、メモリ、ディスク領域、ディスク I/O のオーバーヘッドが増加します。
ROWIDの欠点は、削除された行の値を再利用することです。 この影響を受けないシナリオの場合は、AUTOINCREMENT を無効にし、代わりに SQLite の既定値の生成動作を使用できます。 これを行うには、Metadata 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 以外の使用では生成された値を取得できます。
値の生成を完全に無効にするには、列の種類を INTEGER から INT に変更します。
.NET