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

如何获取刚创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:40:24