LiteDb中子列表类自增ID问题:如何实现B、C类ID自动递增?
在LiteDb中实现嵌套子列表的ID自动递增
LiteDb默认仅会为根集合中的文档自动生成自增ID,嵌套在列表中的子文档(比如你的B和C类)不会触发自动ID生成逻辑,因此它们的Id始终为0。以下是两种可行的解决方式:
方式一:将子文档作为独立集合存储
把B和C分别存入独立的LiteDb集合,这样它们的Id会被自动赋值,之后再关联到A的列表中。示例代码:
using (var db = new LiteDatabase(@"MyData.db")) { var colA = db.GetCollection<A>("As"); var colB = db.GetCollection<B>("Bs"); var colC = db.GetCollection<C>("Cs"); // 插入C并获取自动生成的Id var c1 = new C { Value = "C1" }; colC.Insert(c1); // 插入B并获取自动生成的Id,关联已插入的C var b1 = new B { Value = "B1", Cs = new List<C> { c1 } }; colB.Insert(b1); // 插入A,关联已插入的B var a1 = new A { Value = "A1", Bs = new List<B> { b1 } }; colA.Insert(a1); }
这种方式的优势是完全利用LiteDb原生的自增ID机制,无需额外维护逻辑;缺点是B和C会作为独立文档存储,而非嵌入在A中。
方式二:手动维护序列生成嵌入文档的Id
如果需要保持B和C作为A的嵌入文档,可以通过LiteDb的序列功能手动生成自增ID:
using (var db = new LiteDatabase(@"MyData.db")) { var colA = db.GetCollection<A>("As"); // 生成C的自增Id var cIdSequence = db.GetSequence("C_Id"); var c1 = new C { Id = cIdSequence.Next(), Value = "C1" }; // 生成B的自增Id var bIdSequence = db.GetSequence("B_Id"); var b1 = new B { Id = bIdSequence.Next(), Value = "B1", Cs = new List<C> { c1 } }; // 插入包含嵌入文档的A var a1 = new A { Value = "A1", Bs = new List<B> { b1 } }; colA.Insert(a1); }
GetSequence方法会自动创建并维护序列,每次调用Next()都会返回下一个递增的整数值,确保B和C的Id唯一且自增。
内容的提问来源于stack exchange,提问作者Zoltán
相关产品推荐
相关产品推荐

