You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

[Key]特性未自动增长:SQLite中Id列值始终为0的问题

问题

我定义了如下ViewModel类:

using System.ComponentModel.DataAnnotations;

namespace Proj1.Models
{
    public class Groups
    {
        [Key]
        public int Id { get; set; }
        public string? GrpName { get; set; }
    }
}

原本以为[Key]特性自带自动增长功能,于是创建包含三张表的SQLite数据库:

var dbfile = GenDbName();    // This generates a database file name.
var dbpath = Path.Combine(datLoc, dbfile);     
var Options = new SQLiteConnectionString(dbpath, true);
var conn = new SQLiteAsyncConnection(Options);

await conn.CreateTablesAsync<LakSettings, Groups, PassWrds>();

随后向Groups表插入记录:

var grp = new Groups()
{
    GrpName = "Computer"
};
await conn.InsertAsync(grp);

grp = new Groups()
{
    GrpName = "Email"
};
await conn.InsertAsync(grp);

grp = new Groups()
{
    GrpName = "Internet"
};

await conn.InsertAsync(grp);

但查看Groups表的Id列时,所有记录的Id值均为0,请问这是什么原因?

原因与解决方法
  • 原因:[Key]特性仅用于标记字段为主键,并不自带自动增长功能。int类型的默认值是0,插入数据时你没有手动指定Id的值,SQLite也没有自动生成递增ID的逻辑,因此所有记录的Id都被设为默认值0。
  • 解决方法:给Id字段额外添加[AutoIncrement]特性,让SQLite自动生成递增的主键值。修改后的Groups类如下:
using System.ComponentModel.DataAnnotations;

namespace Proj1.Models
{
    public class Groups
    {
        [Key]
        [AutoIncrement]
        public int Id { get; set; }
        public string? GrpName { get; set; }
    }
}

注意:修改实体类后,需要重新创建表(或手动修改现有表的Id字段为自增主键)才能生效。如果不想重建表,可执行以下SQL语句修改表结构:

ALTER TABLE Groups MODIFY COLUMN Id INTEGER PRIMARY KEY AUTOINCREMENT;

内容的提问来源于stack exchange,提问作者Bob Gatto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:52:33