如何使用版本控制包导入raven db

时间:2013-12-04 08:06:58

标签: ravendb

我有一个打开了版本控制包的数据库。我进行导出,然后尝试将导出的转储导入新创建的数据库。我得到例外“不允许修改历史修订版”。我在Ayende找到了this的问答,这是设计的。但是,如果打开版本控制包并且其中有修订版,如何将数据导入空数据库?

现在我做了以下事情:我创建了一个没有版本控制包但没有版本控制包的新数据库。导入到该数据库(并且它可以工作),但如果我执行搜索,我会有很多重复项。

之后我创建了另一个新数据库,打开了复制和版本控制包。我从数据库复制这个数据库的副本。它的确有效,但它似乎有很多东西要做。

我做对了吗?是否有更简单的方法从转储中获取数据?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我可以让导入工作的唯一方法是执行以下操作:

  1. 创建启用了版本控制的数据库(他们建议使用可能使用的任何捆绑包创建数据库)。
  2. 禁用版本控制包。我通过编辑数据库设置并从“Raven / ActiveBundles”设置中删除捆绑包来完成此操作。
  3. 导入您的数据库。
  4. 启用版本控制包。只需将“版本控制”软件包添加回“Raven / ActiveBundles”设置即可。
  5. 如果有人有更好的主意,我很乐意听到。 :)

答案 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);
            }
        } 
    }