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

LiteDB无法加载BsonRef关联项的问题求助

LiteDB中BsonRef关联项无法加载的问题

我在使用LiteDB时遇到BsonRef项无法加载的问题,以下是最小化LinqPad示例代码:

void Main()
{
    var fn = Path.Join(Path.GetTempPath(), "tmp2.db").Dump("DB");

    File.Delete(fn);
    var db = new LiteDatabase($"Filename={fn}; Connection=shared");

    db.BeginTrans();

    var col = db.GetCollection<Master>();
    col.Insert(new Master() { MasterData = "1", Details = [new() { Rnd1 = 5, Data =  "A" }, new() { Rnd1 = 3, Data =  "B" } ] });
    col.Insert(new Master() { MasterData = "2", Details = [new() { Rnd1 = 1, Data =  "M" }, new() { Rnd1 = 2, Data =  "N" } ] });
    col.Insert(new Master() { MasterData = "3", Details = [new() { Rnd1 = 6, Data =  "X" }, new() { Rnd1 = 9, Data =  "Y" } ] });

    db.Commit();

    col
        .Include(x => x.Details)
        .FindAll()
        .Dump();
}

public class Master 
{
    [BsonId]
    public ObjectId Id { get; set; }
    public required string MasterData { get; set; } 
    [BsonRef]
    public List<Detail> Details { get; set; }
}

public abstract class DetailBase
{ 
    public required int Rnd1 { get; set; }
}

public class Detail : DetailBase
{
    [BsonId]
    public string Id => $"{Rnd1}+{Rnd2}";

    public int Rnd2 { get; set; } = Random.Shared.Next();

    public required string Data { get; set; }
}

代码参照LiteDB官方文档编写。Dump结果显示Master对象已保存加载,但Details数据未加载,仅显示创建时的随机值;LiteDB Studio中可见引用存在,移除[BsonRef]则集合可正常嵌入。

我已尝试多种方案均无效:

  • 在[BsonRef]中指定集合名称
  • 用Fluent配置替代属性
  • 有无显式事务不影响结果
  • 测试v5稳定版和v6预览版
  • 无论是否用Include查询结果一致
  • 继承与否无影响
  • 尝试过ObjectId、int及复合主键

以下简化版本代码结果仍相同:

void Main()
{
    var fn = Path.Join(Path.GetTempPath(), "tmp2.db").Dump("DB");

    File.Delete(fn);
    var db = new LiteDatabase($"Filename={fn}; Connection=shared");

    var col = db.GetCollection<Master>();   

    col.Insert(new Master() { MasterData = "1", Details = [new() { Id = 1, Data =  "A" }, new() { Id = 2, Data =  "B" }, new() { Id = 3, Data =  "Y" } ] });
    col.Insert(new Master() { MasterData = "2", Details = [new() { Id = 4, Data =  "M" }, new() { Id = 5, Data =  "N" } ] });
    col.Insert(new Master() { MasterData = "3", Details = [new() { Id = 6, Data =  "X" } ] });

    col
        .Include(x => x.Details)
        .FindOne(_ => true)
        .Dump();

    col
        .Query()
        .Include(x => x.Details)
        .First()
        .Dump();
    
    db.Dispose();
    
    var repo = new LiteRepository($"Filename={fn}; Connection=shared");
    
    repo.Query<Master>()
        .Include(x => x.Details)
        .First()
        .Dump();
}

public class Master 
{
    [BsonId]
    public ObjectId Id { get; set; }
    public required string MasterData { get; set; } 
    [BsonRef]
    public List<Detail> Details { get; set; }
}

public class Detail
{
    [BsonId]
    public int Id { get; set; }

    public required string Data { get; set; }
}

此外,数据库中看不到Detail集合,手动创建也无数据存入。请问我遗漏了什么?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:34:51