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

SQLite-Net Extensions是否支持List<string>类型属性?

SQLite-Net Extensions 处理 List 的方案

SQLite-Net Extensions 本身是为实体类之间的关联关系设计的(比如你之前用的OneToMany),它不支持直接存储List<string>这类基础类型集合,这也是你遇到报错的原因:

  • 不加特性时,底层SQLite-Net ORM无法识别List<string>类型,不知道如何映射到数据库字段,所以抛出Don't know about System.Collections.Generic.List1[System.String]`。
  • 加[OneToMany]时,该特性要求关联的目标必须是带有主键的实体类,而string是基础类型,不是符合要求的实体,因此报错OneToMany relationships require Primary Key in the destination entity。

要存储List<string>,可以用以下两种可行方案:

方案1:使用SQLite-Net Extensions的[TextBlob]特性

这是官方推荐的处理复杂类型集合的方式,它会自动将集合序列化为JSON字符串存储,查询时再反序列化为集合:

public class Stock
{
    // 原有属性示例
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }

    // 新增的字符串集合属性
    [TextBlob(nameof(TagsBlob))]
    public List<string> Tags { get; set; }

    // 实际存储在数据库中的JSON字段,无需手动操作
    public string TagsBlob { get; set; }
}

这里Tags是业务代码中使用的集合属性,TagsBlob是映射到数据库表的字符串字段,[TextBlob]特性会自动处理两者的序列化和反序列化。

方案2:手动序列化/反序列化

如果不想依赖[TextBlob],可以自己用JSON序列化库(比如System.Text.Json或Newtonsoft.Json)处理:

using System.Text.Json;

public class Stock
{
    // 原有属性示例
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }

    // 业务用的集合属性,标记为不映射到数据库
    [Ignore]
    public List<string> Tags { get; set; } = new List<string>();

    // 数据库中存储的JSON字段,手动处理序列化
    public string TagsJson
    {
        get => JsonSerializer.Serialize(Tags);
        set => Tags = JsonSerializer.Deserialize<List<string>>(value) ?? new List<string>();
    }
}

这种方式需要自己维护TagsJson和Tags的转换关系,[Ignore]特性告诉ORM不要将Tags映射到数据库字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:10:16