通过代码配置RavenDB版本控制

通过代码配置RavenDB版本控制,ravendb,Ravendb,是否可以通过代码在新的RavenDB数据库上配置版本控制 我正在使用以下代码(基于): 但是,当我在数据库中添加和修改记录时,版本控制不起作用。这段代码很好,但它只是创建了版本控制包将查找的配置信息。它实际上并没有启用捆绑包 对于任何命名的bundle,可以通过在Raven/ActiveBundles设置中包含名称来启用它,该设置是一个以分号分隔的bundle名称列表 “命名”捆绑包是指那些使用[ExportMetadata]属性导出捆绑包“名称的捆绑包。所有内置的bundle都可以做到这一点。

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

我正在使用以下代码(基于):


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

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

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

“命名”捆绑包是指那些使用
[ExportMetadata]
属性导出
捆绑包“
名称的捆绑包。所有内置的bundle都可以做到这一点。(如果深入研究,可以看到版本控制捆绑包导出名称
“Versioning”

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

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

命名租户数据库的设置保存在名为
Raven/Databases/
的文档中的系统数据库中。只需编辑此文档一次,即可激活捆绑包。下面是一个扩展方法,可以为您实现这一点:

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();
    }
}
如果您运行的是嵌入式模式数据库,则没有命名的租户数据库,因此过程有点不同。您可以将设置放入自己的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();

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

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

“命名”捆绑包是指那些使用
[ExportMetadata]
属性导出
捆绑包“
名称的捆绑包。所有内置的bundle都可以做到这一点。(如果深入研究,可以看到版本控制捆绑包导出名称
“Versioning”

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

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

命名租户数据库的设置保存在名为
Raven/Databases/
的文档中的系统数据库中。只需编辑此文档一次,即可激活捆绑包。下面是一个扩展方法,可以为您实现这一点:

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();
    }
}
如果您运行的是嵌入式模式数据库,则没有命名的租户数据库,因此过程有点不同。您可以将设置放入自己的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(“”
)?Matt,我可以建议将会话的开始更改为
documentStore.OpenSession(“”