我正在尝试迁移现有的Web应用程序以使用RavenDB。
我目前在我的网络应用程序中有页面,允许您根据查询字符串中的ID查看类别,子类别和资源。
但是我注意到RavenDB为聚合根生成了id,但是没有为子实体生成id。
我不认为子类别是聚合根(类别具有子类别),所以我将其作为我的类别文档的子文档。
我错误地将它作为子文档,因为我通过查询字符串传入的id直接访问它?但如果没有,我应该如何访问单个SubCategories,因为RavenDB似乎不为非聚合根的实体生成id?
答案 0 :(得分:15)
Raven邮件列表上有long but interesting discussion个关于这种情况的结果。
简短的回答是,Raven不是为此而设计的,只有root实体获取id,其他所有内容都被视为值类型。但是您可以自己实现它,请参阅线程末尾的代码示例以获取信息。
答案 1 :(得分:8)
我遇到了这个问题,但是对于让文档生成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,并且可以确保我不必在实际类本身中满足竞争条件等。