当前位置:  开发笔记 > 编程语言 > 正文

RavenDB:子文档的Id生成

如何解决《RavenDB:子文档的Id生成》经验,为你挑选了2个好方法。

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

我目前在我的Web应用程序中有页面,允许您根据查询字符串中的id查看Categories,SubCategories和Resources.

但是我注意到RavenDB为聚合根生成了id,但是没有为子实体生成id.

我不认为子类别是聚合根(类别具有子类别),因此我将其作为我的类别文档的子文档.

我错误地将其作为子文档,因为我通过查询字符串传入的id直接访问它?但如果没有,我应该如何访问单个SubCategories,因为RavenDB似乎不为非聚合根的实体生成id?



1> Matt Warren..:

在Raven邮件列表上有关于这种确切情况的长期但有趣的讨论.

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



2> lomaxx..:

我遇到了这个问题,但是对于让文档生成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)`
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有