RavenDb检查索引是否存在

问题描述:

如何检查索引是否存在? - 打电话之前,我看过RavenDb检查索引是否存在

IndexCreation.CreateIndexes(typeof(MyIndexClass).Assembly, documentStore); 

所有的例子(包括示例项目中的那些)具有指数重新创建客户端启动,每次它看起来不正确。

什么是一般策略?看起来好像是正常的CRUD操作,然后是管理命令,例如上面的索引。人们是否只是创建一个控制台应用程序来管理和部署/运行与主应用程序分开?

+0

我知道这并不能回答你的问题,但我觉得值得一提的是,如果你愿意,RavenDB会为你自动创建索引。参见[这个RavenDB文档页面](http://ravendb.net/docs/client-api/querying),特别是关于动态索引的部分。 – ean5533

+0

@ ean5533 - 适用于动态索引,是的。我相信OP会关注静态索引的创建。 –

您不必检查是否存在。服务器将自动比较您发送的索引定义并检查它是否已经存在。如果存在一个具有相同名称和定义的名称,则将其单独保留。如果存在一个名称相同的名称,但定义已更改,则删除旧的名称并创建新名称。

通常人们会在应用程序启动时在同一应用程序中创建索引。对于可能位于global.asax中的Web应用程序以及控制台/桌面应用程序,它只是启动代码的第一部分。

但有时候这是不可能的,比如如果你有许多不同的数据库,就像多租户应用程序经常这样做。在这种情况下,当您创建每个租户数据库时,您会创建索引,并且您在部署版本升级时可能需要更新或创建更多索引。

另外,我应该提到你可以用几种不同的方式创建索引。

// scans the assembly for all indexes and creates them 
IndexCreation.CreateIndexes(assembly, documentStore); 

// scans a MEF catalog for all indexes and creates them 
IndexCreation.CreateIndexes(catalog, documentStore); 

// puts a single index the HARD way 
documentStore.DatabaseCommands.PutIndex(...); 

// puts a single index the easy way 
documentStore.ExecuteIndex(new YourIndexCreationTask()); 

还有其他几个,但你明白了。

而只是为了要彻底,如果你真的没检查索引所有脑干,你可以使用:

documentStore.DatabaseCommands.GetIndex("YourIndex") != null 

但是,这只能通过名字查询,而不是定义。你不需要它。

+0

感谢您的解释。阅读完本书后,我有了一个“哈哈片”! – trailmax

+0

这个建议看起来不对。如果我在已经存在的索引上调用PutIndex,我得到一个InvalidOperationException - 索引已经存在。我正在使用v2.5。难道我做错了什么 ? – Chris

+2

你可以选择通过设置第三个参数覆盖它为true –