SQLite 值生成

此页详细介绍特定于 SQLite 提供程序的值生成配置和模式。 建议先阅读 有关值生成的常规页

自动增量列字段

按照惯例,配置为在添加时生成其值的数字主键列使用 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();
}

禁用 AUTOINCREMENT 以生成默认的 SQLite 值

与 SQLite - ROWID 中的默认密钥生成算法相比,AUTOINCREMENT 会产生额外的 CPU、内存、磁盘空间和磁盘 I/O 开销。 其缺点 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 用法仍然可以获取生成的值。 若要 完全禁用值生成,请将列类型从 INTEGER 更改为 INT