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

使用RavenDb时使用现有数据重命名数据库中的模型,ravendb,Ravendb,当数据库已有数据时,有没有“简单”的方法来重命名RavenDb中的模型?我有许多最初用另一种语言创建的模型,现在我想将它们重命名为英语,因为代码库变得非常不可维护。如果我只是重命名它们,那么数据将不会加载,因为属性不再匹配 我想让系统在第一次加载时自动完成。有没有最好的方法来解决这个问题?我的解决办法是: 检查文档是否存在,以确定升级是否已完成 如果尚未完成升级,请执行修补程序脚本以更新字段 更新文档以了解升级已完成 我建议您从旧文档创建新文档 这可以很容易地通过使用补丁通过 假设我有一个旧类型

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

我想让系统在第一次加载时自动完成。有没有最好的方法来解决这个问题?我的解决办法是:

  • 检查文档是否存在,以确定升级是否已完成
  • 如果尚未完成升级,请执行修补程序脚本以更新字段
  • 更新文档以了解升级已完成

  • 我建议您从旧文档创建新文档

    这可以很容易地通过使用补丁通过

    假设我有一个旧类型名Foo,并想将其重命名为新类型名Bar。我希望所有的ID都从Foos/123改为bar/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();
    
    var patchScript=@”
    //复制旧文档中的所有属性
    var newDoc={};
    for(本文件中的var prop){
    如果(prop!='@metadata'){
    newDoc[prop]=此[prop];
    }
    }
    //创建元数据。
    var meta={};
    meta['Raven-Entity-Name']=newCollection;
    meta['Raven-Clr-Type']=newType;
    //存储新文档。
    var newId=\u文档\u id.replace(oldCollection,newCollection);
    PutDocument(newId、newDoc、meta);
    ";
    var oldCollection=“Foos”;
    var newCollection=“bar”;
    var newType=“karlcasar.Bar,karlcasar”//其中KarlCassar是您的程序集名称。
    var query=newindexquery{query=$“标记:{oldCollection}”};
    var options=new BulkOperationOptions{AllowStale=false};
    var patch=新的ScriptedPatchRequest
    { 
    脚本=补丁脚本,
    值=新字典
    {
    {nameof(oldCollection),oldCollection},
    {nameof(newCollection),newCollection},
    {nameof(newType),newType}
    }
    };
    var patchOperation=docStore.DatabaseCommands.UpdateByIndex(“Raven/DocumentsByEntityName”,查询,补丁,选项);
    patchOperation.WaitForCompletion();
    
    在启动时运行该代码一次,然后您的应用程序将能够使用新的名称实体。您的旧实体仍然存在-可以通过Studio安全地删除这些实体