通过代码配置RavenDB版本控制

时间:2013-06-19 22:26:18

标签: 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();
}

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

1 个答案:

答案 0 :(得分:4)

该代码很好,但它只是创建了Versioning Bundle所寻找的配置信息。它实际上并没有启用捆绑包。

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

由"命名" bundle,我的意思是使用"Bundle"属性导出[ExportMetadata]名称的那些。所有内置捆绑都可以做到这一点。 (如果深入研究source code of one of its triggers),您可以看到版本控制包导出名称"Versioning"

如果某个包未命名,则只要它存在于RavenDB服务器程序集中,或者存在于\plugins文件夹中的单独程序集中,它就会始终启用。

看起来文档需要更新,因为它仍然说将Raven.Bundles.Versioning.dll程序集放在plugins文件夹中。它已不再存在,因为它已移入2.0中的主RavenDB服务器程序集。因此,对于这个特定的捆绑包,只需编辑设置即可。

命名租户数据库的设置保存在名为Raven/Databases/<YourDatabaseName>的文档的系统数据库中。只需编辑一次该文档,即可激活该软件包。这是一个扩展方法,可以帮助您:

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();