ravendb - 通过代码配置 RavenDB 版本控制

标签 ravendb

是否可以通过代码在新的 RavenDB 数据库上配置版本控制?

我正在使用以下代码(基于 http://ravendb.net/docs/2.0/server/extending/bundles/versioning ):

Store.DatabaseCommands.EnsureDatabaseExists(database);
using (var session = Store.OpenSession(database))
{
    session.Store(new 
        {
            Exclude = false,
            Id = "Raven/Versioning/DefaultConfiguration",
            MaxRevisions = 5
        });
    session.SaveChanges();
}

但是当我在数据库中添加和修改记录时,版本控制不起作用。

最佳答案

该代码很好,但它只是创建版本控制包将查找的配置信息。它实际上并没有启用该 bundle 。

对于任何命名 bundle ,您可以通过将名称包含在 Raven/ActiveBundles 中来启用它。设置,这是一个以分号分隔的包名称列表。

“命名” bundle 是指那些导出 "Bundle" 的 bundle 。使用 [ExportMetadata] 命名属性。所有内置 bundle 都执行此操作。 (如果您深入研究 source code of one of its triggers ,您可以看到版本控制包导出名称 "Versioning" )。

如果 bundle 未命名,那么只要它存在于 RavenDB 服务器程序集中或 \plugins 中的单独程序集中,它就始终处于启用状态。文件夹。

看起来文档需要更新,因为它仍然说要放置 Raven.Bundles.Versioning.dll程序集在插件文件夹中。它不再存在,因为它在 2.0 中被移至主要的 RavenDB 服务器组件中。因此,对于这个特定的 bundle ,只需编辑设置就足够了。

指定租户数据库的设置保存在系统数据库中名为 Raven/Databases/<YourDatabaseName> 的文档中。 。只需编辑此文档一次, bundle 就会被激活。这是一个可以为您完成此操作的扩展方法:

public static void ActivateBundle(this IDocumentStore documentStore, string bundleName, string databaseName)
{
    using (var session = documentStore.OpenSession())
    {
        var databaseDocument = session.Load<DatabaseDocument>("Raven/Databases/" + databaseName);

        var settings = databaseDocument.Settings;
        var activeBundles = settings.ContainsKey(Constants.ActiveBundles) ? settings[Constants.ActiveBundles] : null;
        if (string.IsNullOrEmpty(activeBundles))
            settings[Constants.ActiveBundles] = bundleName;
        else if (!activeBundles.Split(';').Contains(bundleName, StringComparer.OrdinalIgnoreCase))
            settings[Constants.ActiveBundles] = activeBundles + ";" + bundleName;

        session.SaveChanges();
    }
}

使用上面的方法,您可以简单地调用:

documentStore.ActivateBundle("Versioning", "YourDatabaseName");

如果您运行的是嵌入式模式数据库,则没有命名租户数据库,因此过程会有所不同。您可以将设置放入您自己的 app.config 文件中,也可以操作 documentStore.Configuration.Settings在您现有的调用 documentStore.Initialize() 之前字典。以下是适用于嵌入式数据库的扩展方法的修订版本:

public static void ActivateBundle(this EmbeddableDocumentStore documentStore, string bundleName)
{
    var settings = documentStore.Configuration.Settings;
    var activeBundles = settings[Constants.ActiveBundles];
    if (string.IsNullOrEmpty(activeBundles))
        settings[Constants.ActiveBundles] = bundleName;
    else if (!activeBundles.Split(';').Contains(bundleName, StringComparer.OrdinalIgnoreCase))
        settings[Constants.ActiveBundles] = activeBundles + ";" + bundleName;
}

使用此方法,您可以简单地执行以下操作:

documentStore.ActivateBundle("Versioning");
documentStore.Initialize();

关于ravendb - 通过代码配置 RavenDB 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17202434/

相关文章:

c# - 正确的处理方式 : object not disposed along all exception paths

datetime - 日期时间上的 RavenDB 查询,具有集合偏移量中的值

c# - 如何对 IRepository 进行单元测试?

c# - RavenDB 自动 tmpindex 和手动索引

linq - 将 Expression<Func<T, bool>> 发送到 Where() 扩展方法时,Ravendb Session.Query<T>() 方法不返回任何结果

ravendb - 我应该如何为 RavenDB 中的文档建模这种关系?

ravendb - RavenDB:如何使用多个搜索词进行查询

c# - 将文档从 MVC 网页保存到第二个 RavenDb

ravendb - 使用 RavenDB 映射/减少分片数据

c# - ravendb 索引,查询子集合