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

SQLite报错Cannot update List`1: it has no PK的原因及解决方法

问题分析与修复方案

问题原因

  1. 模型类不匹配:你定义的SQLite映射模型是PassMod,但更新逻辑中实例化的是PassWrds类。如果PassWrds的Id字段没有添加[PrimaryKey, AutoIncrement]特性,SQLite-net无法识别该类的主键,执行批量更新时就会抛出"Cannot update List`1: it has no PK"错误。
  2. 冗余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:41