使用RavenDb时,使用现有数据重命名数据库中的模型

时间:2017-11-16 17:07:04

标签: ravendb

当数据库已有现有数据时,是否有任何'简单'方法在RavenDb中重命名模型?我有各种模型,最初是用另一种语言创建的,现在我想将它们重命名为英语,因为代码库变得非常难以维护。如果我只是重命名它们,那么将不会加载数据,因为属性不再匹配。

我希望系统在第一次加载时自动执行。有没有最好的方法来解决这个问题?我的解决方案是:

  1. 检查文档是否存在以确定升级是否已完成
  2. 如果尚未升级,请执行补丁脚本以更新字段
  3. 更新文档以了解升级已完成

1 个答案:

答案 0 :(得分:1)

我建议您从旧文档中创建新文档。

通过docStore.UpdateByIndex修补,可以非常轻松地完成此操作。

假设我有一个旧的类型名称Foo,并希望将其重命名为新的类型名称Bar。我希望所有ID都从Foos / 123更改为Bars / 123。

它看起来像这样:

var patchScript = @"
   // Copy all the properties from the old document
   var newDoc = {};
   for (var prop in this) {
       if (prop !== '@metadata') {
          newDoc[prop] = this[prop];
       }
   }

   // Create the metadata.
   var meta = {};
   meta['Raven-Entity-Name'] = newCollection;
   meta['Raven-Clr-Type'] = newType;

   // Store the new document.
   var newId = __document_id.replace(oldCollection, newCollection);
   PutDocument(newId, newDoc, meta);
";

var oldCollection = "Foos";
var newCollection = "Bars";
var newType = "KarlCassar.Bar, KarlCassar"; // Where KarlCassar is your assembly name.
var query = new IndexQuery { Query = $"Tag:{oldCollection}" };
var options = new BulkOperationOptions { AllowStale = false };
var patch = new ScriptedPatchRequest 
{ 
   Script = patchScript,
   Values = new Dictionary<string, object>
   {
       { nameof(oldCollection), oldCollection },
       { nameof(newCollection), newCollection },
       { nameof(newType), newType }
   }
};

var patchOperation = docStore.DatabaseCommands.UpdateByIndex("Raven/DocumentsByEntityName", query, patch, options);
patchOperation.WaitForCompletion();

在启动时运行该代码一次,然后您的应用程序将能够使用新名称实体。您的旧实体仍然存在 - 可以通过Studio安全删除。