使用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安全地删除这些实体