我有一个打开了版本控制包的数据库。我进行导出,然后尝试将导出的转储导入新创建的数据库。我得到例外“不允许修改历史修订版”。我在Ayende找到了this的问答,这是设计的。但是,如果打开版本控制包并且其中有修订版,如何将数据导入空数据库?
现在我做了以下事情:我创建了一个没有版本控制包但没有版本控制包的新数据库。导入到该数据库(并且它可以工作),但如果我执行搜索,我会有很多重复项。
之后我创建了另一个新数据库,打开了复制和版本控制包。我从数据库复制这个数据库的副本。它的确有效,但它似乎有很多东西要做。
我做对了吗?是否有更简单的方法从转储中获取数据?
答案 0 :(得分:2)
我遇到了同样的问题。我可以让导入工作的唯一方法是执行以下操作:
如果有人有更好的主意,我很乐意听到。 :)
答案 1 :(得分:0)
新版本的RavenDb 3.0提供了导入的权限,已经激活了Bundle。所以禁用和启用的所有技巧都不再有用了。但是,您可能会遇到新问题,例如索引与您的修订版不同步,或者“版本控制”窗口中没有显示“版本控制”。
要修复版本控制,如果它们未在版本控制窗口中显示但在系统文档中可见,则需要单独添加Id或运行某种代码。
自RavenDb 3.0.3745 以来导入的选项参数: --disable-版本控制过程中导入
修复版本不包含ID:
private void UpdateVersioning(string destinationRavenDbServer, string databaseName)
{
using (var documentStore = new DocumentStore { Url = destinationRavenDbServer, DefaultDatabase = databaseName })
{
documentStore.Initialize();
using (var session = documentStore.OpenSession())
{
var versioningInfoList = session.Advanced.LoadStartingWith<RavenJObject>("Raven/Versioning/", pageSize: 1024 );
foreach (var versioningInfo in versioningInfoList)
{
if (!versioningInfo.ContainsKey("Id"))
{
var fullInternalId = session.Advanced.GetDocumentId(versioningInfo);
var idSplitted = fullInternalId.Split('/');
var newId = idSplitted[idSplitted.Length - 1];
versioningInfo.Add("Id", newId);
}
}
session.SaveChanges();
}
}
}
修复重新索引所有数据库:
private void ResetAllIndexes(string destinationRavenDbServer, string databaseName)
{
using (var documentStore = new DocumentStore { Url = destinationRavenDbServer, DefaultDatabase = databaseName })
{
documentStore.Initialize();
var indexes = documentStore.DatabaseCommands.GetIndexNames(0, 1024); // Update the 1024 first index, but you get the idea
foreach (var indexName in indexes)
{
documentStore.DatabaseCommands.ResetIndex(indexName);
}
}
}