使用自定义插件目录的EmbeddableDocumentStore不会选择UniqueConstraints包

时间:2016-01-20 17:11:27

标签: ravendb

我们正在使用EmbeddableDocumentStore进行非生产部署,一般情况下效果很好。我偶然发现了一个问题,这个问题花了我几个小时来解决,我很高兴知道我所经历的行为是否符合设计。

我这样初始化EmbeddableDocumentStore

var store = new EmbeddableDocumentStore()
{
    DataDirectory = dataDirectory,
    DefaultDatabase = "DbName",
    RunInMemory = false,
    UseEmbeddedHttpServer = true,
};

store.Configuration.Port = 10001;
store.Configuration.PluginsDirectory = pluginsDirectory; // this is the important line
store.Configuration.CompiledIndexCacheDirectory = compiledIntexCacheDirectory;
store.Configuration.Storage.Voron.AllowOn32Bits = true;
store.RegisterListener(new UniqueConstraintsStoreListener());
store.Initialize();

使用此设置,UniqueConstraints不能在嵌入式服务器上运行。

然而,当我把plugins目录放到它的默认位置(WorkingDirectory + / Plugins)时,它神奇地开始工作。 这是预期的行为吗?

更多信息:

我可以在控制台应用和Web应用中重现它。在Web应用程序中,默认位置是web root + / Plugins。

经过一些调查后,我发现UniqueConstraints的触发器在store.Configuration.Catalog.Catalogs中的注册方式存在差异,这可能与意外(对我而言)行为有关。

使用自定义PluginDirectory,触发器在store.Configuration.Catalog.Catalogs中注册为BuiltinFitleringCatalog

Custom location

当捆绑包位于默认位置时,触发器会添加到BundlesFilteredCatalog中的store.Configuration.Catalog.Catalogs以及所有其他默认触发器:

Default location

1 个答案:

答案 0 :(得分:0)

什么版本的RavenDB?

在RavenDB 3.5中,在服务器端注册插件需要一个魔术字符串。将此添加到上面的示例中可能会解决此问题。

store.Configuration.Settings =
{
    { "Raven/ActiveBundles", "Unique Constraints" }
};