【问题标题】:RavenDB: Id Generation For Sub-DocumentsRavenDB:子文档的 ID 生成
【发布时间】:2011-03-11 04:01:58
【问题描述】:

我正在尝试迁移现有的 Web 应用程序以使用 RavenDB。

我的 Web 应用程序中目前有一些页面,允许您根据查询字符串中的 id 查看类别、子类别和资源。

但是我注意到 RavenDB 会为聚合根生成 id,但不会为子实体生成 id。

我不认为子类别是聚合根(类别有子类别),所以我将其作为我的类别文档的子文档。

当我通过在查询字符串中传入的 id 直接访问它时,将其设为子文档是不是错了?但如果不是,我应该如何访问各个子类别,因为 RavenDB 似乎不会为不是聚合根的实体生成 id?

【问题讨论】:

    标签: nosql ravendb document-database


    【解决方案1】:

    Raven 邮件列表上有一个 long but interesting discussion 上面关于这种确切情况的信息。

    简短的回答是,Raven 不是为此而设计的,只有根实体获得一个 id,其他一切都被视为值类型。但您可以自己实现,请参阅线程末尾的代码示例以获取信息。

    【讨论】:

    • 谢谢马特。这准确地描述了我的情况。一旦我有足够的声誉,我会为你的答案投票。
    【解决方案2】:

    我遇到了这个问题,但我不喜欢让文档生成 ID,因为我觉得它不是线程安全的,尤其是对于基于 Web 的环境。

    最终我决定让服务器使用 GenerateDocumentKey 方法为我生成 ID,如下所示:

    using (var session = Store.OpenSession())
    {
        if(category.SubCategories != null)
        {
           var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id));
            foreach (var sc in newSubCategories)
                sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);    
        }
    
        session.Store(data);
        session.SaveChanges();
    }
    

    通过这种方式,我允许数据库生成子 ID,并且可以确保我不必在实际班级本身中满足竞争条件等。

    【讨论】:

    • 请注意,现在是Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey(sc)
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多