【问题标题】:Configure RavenDB versioning via code通过代码配置 RavenDB 版本控制
【发布时间】:2013-06-20 07:13:35
【问题描述】:

是否可以通过代码在新的 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();
}

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

【问题讨论】:

    标签: ravendb


    【解决方案1】:

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

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

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

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

    看起来文档需要更新,因为它仍然说将Raven.Bundles.Versioning.dll 程序集放在插件文件夹中。这不再存在,因为它在 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.Initialize() 的现有调用之前操作documentStore.Configuration.Settings 字典。以下是适用于嵌入式数据库的扩展方法的修订版:

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

    【讨论】:

    • Matt,我可以建议将会话的开头更改为 documentStore.OpenSession("&lt;system&gt;") 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2016-06-11
    相关资源
    最近更新 更多