SQLite报错Cannot update List`1: it has no PK的原因及解决方法
问题分析与修复方案
问题原因
- 模型类不匹配:你定义的SQLite映射模型是
PassMod,但更新逻辑中实例化的是PassWrds类。如果PassWrds的Id字段没有添加[PrimaryKey, AutoIncrement]特性,SQLite-net无法识别该类的主键,执行批量更新时就会抛出"Cannot update List`1: it has no PK"错误。 - 冗余的List包装:SQLite-net的
UpdateAsync方法支持直接更新单个实体,没必要刻意将单条数据包装成List,这反而增加了出错风险。
修复方案
方案1:统一使用PassMod模型类(推荐)
将更新逻辑中的PassWrds替换为你已定义好的PassMod,并直接更新单个实体:
private async void btnUpdt_Clicked(object sender, EventArgs e) { var updatedPass = new PassMod() { Id = psWGp[0].Id, Title = pw.pwTitle, UsrName = pw.pwUsrname, Passwrd = newpasswrd, SiteAddr = pw.pwSiteaddr, GrpId = pw.gId, Notes = pw.pwNotes }; await conn.UpdateAsync(updatedPass); }
方案2:为PassWrds添加主键特性(若必须使用该类)
如果业务逻辑要求使用PassWrds,需要给它的Id字段添加主键标记:
using SQLite; public class PassWrds { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string? Title { get; set; } public string? UsrName { get; set; } public string? Passwrd { get; set; } public string? SiteAddr { get; set; } public int GrpId { get; set; } public string? Notes { get; set; } }
之后可选择更新单个实体,或使用UpdateAllAsync(SQLite-net针对集合更新的专用方法):
// 更新单个实体(简洁推荐) var updatedPass = new PassWrds() { Id = psWGp[0].Id, Title = pw.pwTitle, UsrName = pw.pwUsrname, Passwrd = newpasswrd, SiteAddr = pw.pwSiteaddr, GrpId = pw.gId, Notes = pw.pwNotes }; await conn.UpdateAsync(updatedPass); // 或更新集合(若有批量需求) List<PassWrds> lst = new List<PassWrds>(); lst.Add(updatedPass); await conn.UpdateAllAsync(lst);
内容的提问来源于stack exchange,提问作者Bob Gatto
相关产品推荐
相关产品推荐

