如何获取刚创建的Raven自动生成ID的文档ID?
嘿,关于RavenDB自动生成ID后怎么立刻拿到的问题,我日常用的时候总结了几个实用的方法,给你参考下:
获取RavenDB自动生成文档ID的几种方式
1. 保存后直接访问实体的Id属性
这是最常用也最省心的方式。当你用session.Store()提交一个没有指定ID的实体,调用session.SaveChanges()完成持久化后,RavenDB会自动把生成的ID赋值给实体的Id属性(只要你的实体类定义了这个字符串类型的属性就行)。举个代码例子:
// 创建新文档实体 var user = new User { Name = "John Doe", Email = "john@example.com" }; // 存入会话 session.Store(user); // 提交变更到数据库 session.SaveChanges(); // 现在直接拿user.Id就是自动生成的ID了 string generatedId = user.Id;
RavenDB的会话会在保存后自动同步服务器生成的ID到实体对象上,非常方便。
2. 提前生成ID(无需立即保存)
如果你的业务需要在保存文档前就知道ID(比如要提前关联其他文档、生成关联链接等),可以用会话的高级API提前生成符合规则的ID:
var product = new Product { Name = "Wireless Headphones" }; // 提前生成ID string preGeneratedId = session.Advanced.GenerateDocumentIdFor(product); // 可以先用这个ID做其他操作,比如关联到订单里 var order = new Order { ProductId = preGeneratedId, Quantity = 1 }; // 存储产品时指定这个提前生成的ID session.Store(product, preGeneratedId); session.Store(order); session.SaveChanges();
这种方式生成的ID和服务器自动生成的规则一致,完全可以放心使用。
3. 批量处理时订阅AfterSaveChanges事件
如果是批量存储多个文档,想要统一获取所有新增文档的ID,可以订阅会话的AfterSaveChanges事件,在回调里批量处理:
// 订阅事件 session.Advanced.AfterSaveChanges += (sender, eventArgs) => { foreach (var entity in eventArgs.Entities) { string docId = session.Advanced.GetDocumentId(entity); // 这里可以对每个ID做后续处理,比如记录日志、更新缓存等 Console.WriteLine($"新增文档ID: {docId}"); } }; // 批量存储文档 session.Store(new Article { Title = "RavenDB Tips" }); session.Store(new Comment { Content = "Great article!" }); session.SaveChanges();
这个方法适合批量操作场景,不用逐个去获取实体的ID。
需要注意的是,除了提前生成ID的情况,其他方式都要在调用SaveChanges()之后才能拿到有效的ID,因为自动ID是服务器端生成的,会话会在提交后同步这个信息到本地实体。
内容的提问来源于stack exchange,提问作者BMills
相关产品推荐
相关产品推荐

