是否可以通过代码在新的 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/