litedb是轻量级单文件嵌入式nosql数据库,安装用dotnet add package litedb,初始化自动建库建集合,id字段需public且类型匹配,linq仅支持基础操作,多线程需共享实例或启用shared模式。

LiteDB 是一个轻量级、零配置、单文件的嵌入式 NoSQL 数据库,适合桌面应用、IoT 设备或小型工具中做本地文档存储。它不依赖服务进程,直接读写 .db 文件,C# 调用简洁,但有几个关键点不注意就容易卡住。
如何安装 LiteDB 并创建第一个数据库文件
通过 NuGet 安装最新稳定版(推荐 LiteDB 5.x 或 6.x,避免用已归档的 4.x):
dotnet add package LiteDB
初始化时只需一个文件路径,LiteDB 会自动创建文件和集合(collection),无需预定义 schema:
using var db = new LiteDatabase("mydata.db");<br>var collection = db.GetCollection<Person>("people");注意:mydata.db 会生成在当前工作目录(不是项目根目录),调试时建议用绝对路径或 Path.Combine(AppContext.BaseDirectory, "mydata.db") 显式指定位置。
插入和查询文档时怎么处理 ID 字段
LiteDB 默认把名为 _id 或 Id(大小写敏感)的字段识别为主键,类型支持 ObjectId、int、long、string 等。常见陷阱:
- 如果类里没定义
Id或_id,插入时会自动生成ObjectId,但后续按 int 查询会失败 -
Id属性必须是 public 且可 get/set,只读属性或 private set 不被序列化 - 用
int当主键时,不设默认值会导致插入失败(需手动赋值或用BsonAutoId.Int32配置)
推荐做法:
public class Person<br>{<br> public int Id { get; set; } // ← 必须 public,且类型与查询一致<br> public string Name { get; set; }<br> public DateTime Created { get; set; }<br>}如何安全地执行查询并避免 LINQ 意外失效
LiteDB 支持部分 LINQ 方法,但不是全部。比如 .Where(x => x.Name.Contains("a")) 可用,但 .OrderByDescending(x => x.Created.Date) 会抛 NotSupportedException。
关键限制:
- 只支持简单成员访问、常量比较、
==/!=/>// <code>Contains/StartsWith等基础操作 - 不支持
DateTime.Date、ToString()、方法调用链(如x.Name.Trim().ToLower()) - 复杂条件建议用
Find(Query.EQ("Name", "Alice"))手动构造查询对象,更可控
示例(安全写法):
var results = collection.Find(x => x.Id > 100 && x.Name.StartsWith("A"));<br>// 或等价的手动查询<br>var query = Query.And(Query.GT("Id", 100), Query.StartsWith("Name", "A"));<br>var results2 = collection.Find(query);多线程写入时为什么报“database is locked”
LiteDB 默认以独占模式打开文件,多个 LiteDatabase 实例同时写入必然冲突。这不是 bug,是设计使然。
解决方式只有两种:
- 全局复用一个
LiteDatabase实例(推荐用于单进程应用),用static或 DI 容器管理生命周期 - 改用连接字符串加
connection=shared参数(仅限 LiteDB 5+),允许并发读,但写仍需排队:new LiteDatabase("filename.db?connection=shared")
注意:shared 模式下仍不支持事务跨多个集合原子提交;若需强一致性,应避免高并发写场景,或改用 SQLite。
LiteDB 最容易被低估的是它的序列化行为:所有 public 属性都会被存,null 值也会保留;嵌套对象自动展开为子文档,但循环引用直接抛异常。实际用之前,先用 LiteDB.Shell 工具打开 .db 文件看看生成的 BSON 结构,比读文档更快定位问题。








