如何将Envers审计数据迁移至RavenDB 4并修改修订时间戳
解决RavenDB迁移中替换修订时间戳的方案
嘿,针对你从SAP SQLAnywhere + NHibernate Envers迁移到RavenDB 4,还要把Envers的审计时间戳替换掉Raven默认迁移时间的需求,我整理了几个可行的方案,都能避开创建遗留集合或额外元数据的问题:
方案1:插入修订时直接设置原始时间戳(推荐)
RavenDB的修订记录本质上是存储在@revisions系统集合中的文档,你可以用低级文档API直接插入这些修订,同时手动指定元数据里的@last-modified字段为Envers的原始时间戳。这样不需要后续补丁,一步到位。
举个C#代码示例:
// 从Envers获取单条审计记录 var enversAudit = FetchEnversAuditRecord(); // 对应RavenDB中目标实体的ID var targetDocId = enversAudit.EntityUniqueId; // 用Envers的修订号作为Raven的修订编号(确保唯一递增) var revisionNumber = enversAudit.RevisionId; // 把Envers中的实体快照转换成Raven能识别的格式(比如JObject) var revisionContent = JObject.Parse(enversAudit.EntitySnapshotJson); // 构建修订记录的元数据,核心是设置原始时间戳 var revisionMetadata = new MetadataDictionary { ["@last-modified"] = enversAudit.RevisionTimestamp, // Envers的原始时间 ["@revision"] = revisionNumber, ["@collection"] = "YourTargetEntityCollection", // 目标实体所属的集合名 ["@document-id"] = targetDocId // 关联到目标实体的ID }; // 用低级API插入修订记录 session.Advanced.PutDocument( $"@revisions/{targetDocId}/{revisionNumber}", revisionMetadata, revisionContent );
方案2:补丁已插入的修订记录的时间戳
如果已经按原步骤插入了修订记录(此时时间戳是迁移时间),可以通过补丁操作修改对应修订文档的元数据,替换成原始时间戳。这种方式适合已经完成部分迁移的场景:
var enversAudit = FetchEnversAuditRecord(); // 拼接出该修订记录在Raven中的文档ID var revisionDocId = $"@revisions/{enversAudit.EntityUniqueId}/{enversAudit.RevisionId}"; // 补丁元数据,替换时间戳 session.Advanced.PatchMetadata(revisionDocId, metadata => metadata["@last-modified"] = enversAudit.RevisionTimestamp );
更优迁移方式:批量插入提升性能
如果你的审计数据量很大,推荐用RavenDB的BulkInsert API批量处理,既高效又能一次性设置好原始时间戳:
using (var bulkInsert = documentStore.BulkInsert()) { foreach (var enversAudit in FetchAllEnversAuditRecords()) { var revisionDocId = $"@revisions/{enversAudit.EntityUniqueId}/{enversAudit.RevisionId}"; var revisionMetadata = new MetadataDictionary { ["@last-modified"] = enversAudit.RevisionTimestamp, ["@revision"] = enversAudit.RevisionId, ["@collection"] = "YourTargetEntityCollection", ["@document-id"] = enversAudit.EntityUniqueId }; bulkInsert.Put(revisionDocId, revisionMetadata, JObject.Parse(enversAudit.EntitySnapshotJson)); } }
注意事项
- 确保Envers的修订号是唯一且递增的,避免和RavenDB自动生成的修订号冲突;
@collection字段必须和目标实体在RavenDB中的集合名称完全一致,否则修订记录无法正确关联到实体;- 所有操作都基于RavenDB的系统集合
@revisions,不需要创建任何自定义的遗留集合或额外元数据字段。
内容的提问来源于stack exchange,提问作者Zote
相关产品推荐
相关产品推荐

