[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
相关产品推荐
相关产品推荐

