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

