我们正在使用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
:
当捆绑包位于默认位置时,触发器会添加到BundlesFilteredCatalog
中的store.Configuration.Catalog.Catalogs
以及所有其他默认触发器:
答案 0 :(得分:0)
什么版本的RavenDB?
在RavenDB 3.5中,在服务器端注册插件需要一个魔术字符串。将此添加到上面的示例中可能会解决此问题。
store.Configuration.Settings =
{
{ "Raven/ActiveBundles", "Unique Constraints" }
};