当数据库已有现有数据时,是否有任何'简单'方法在RavenDb中重命名模型?我有各种模型,最初是用另一种语言创建的,现在我想将它们重命名为英语,因为代码库变得非常难以维护。如果我只是重命名它们,那么将不会加载数据,因为属性不再匹配。
我希望系统在第一次加载时自动执行。有没有最好的方法来解决这个问题?我的解决方案是:
答案 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安全删除。