C# LiteDB嵌入式数据库方法 C#如何使用一个简单的NoSQL数据库

来源:这里教程网 时间:2026-02-21 17:40:13 作者:

LiteDB 是什么,适合什么场景

LiteDB 是一个轻量级、零配置、单文件的 NoSQL 嵌入式数据库,专为 .NET 设计。它不依赖服务进程,不需安装,直接通过 NuGet 引用

LiteDB
包就能用。适合桌面应用、IoT 设备、CLI 工具、原型开发等需要本地持久化但不想搭 MongoDB 或 SQLite(关系型)的场景。

不适合高并发写入、复杂事务、多用户共享访问 支持 BsonDocument 和强类型 POCO,自动序列化/反序列化 默认使用
LiteDatabase
单例模式打开文件,同一进程内多个实例可能引发文件锁冲突

如何初始化并插入一条数据

LiteDatabase
打开一个 .db 文件路径,获取
LiteCollection<t></t>
后调用
Insert
即可。注意:路径必须可写,且目录存在(LiteDB 不自动创建父目录)。

using var db = new LiteDatabase(@"C:\data\users.db");
var users = db.GetCollection<User>("users");
users.Insert(new User { Id = ObjectId.NewObjectId(), Name = "Alice", Age = 30 });
ObjectId
是 LiteDB 自带的主键类型,推荐作为
_id
字段(类中字段名必须是
_id
或加
[BsonId]
特性)
如果没定义
_id
,LiteDB 会自动生成并写入,但强类型建议显式声明
插入后不调用
db.Dispose()
或 using 会导致文件句柄未释放,后续打开失败

查询数据时为什么查不到,常见错误有哪些

最常踩的坑是字段名大小写不一致或未正确映射。LiteDB 默认按属性名(非字段名)映射,且区分大小写;若类中用

public string name { get; set; }
(小写),而查询用
name == "Alice"
,能查到;但若实际存的是
Name
(PascalCase),而查询写成
name == "Alice"
就为空。

查询必须用 LINQ 表达式,
Find(x => x.Name == "Alice")
是对的,
Find("Name == 'Alice'")
(字符串查询)已弃用且不推荐
FindAll()
返回所有,但大数据集慎用,无索引时是全表扫描
没建索引的字段做
Where
条件,性能随数据量线性下降
若实体类有只读属性(
get
set
),LiteDB 默认跳过,不会报错但也不存值

如何安全地在多线程中使用 LiteDB

LiteDB 的

LiteDatabase
实例不是线程安全的。官方明确要求:每个线程应有自己的
LiteDatabase
实例,或复用同一个实例但确保串行访问(比如加锁)。

✅ 推荐方式:每次操作都新建
LiteDatabase
(开销极小,底层有连接池优化)
❌ 错误方式:全局静态
LiteDatabase
实例被多个线程同时调用
Insert
/
Find
若必须复用,可用
lock
包裹集合操作,但会牺牲并发吞吐
长期运行的服务中,避免让
LiteDatabase
实例存活过久(如 static),因内部缓存和文件句柄可能累积

LiteDB 看似简单,但字段映射规则、线程模型、索引缺失导致的静默性能退化,这三点最容易在上线后才暴露。

相关推荐