2012-12-12 85 views
8

如何檢查索引是否存在? - 打電話之前,我看過RavenDb檢查索引是否存在

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

所有的例子(包括示例項目中的那些)具有指數重新創建客戶端啓動,每次它看起來不正確。

什麼是一般策略?看起來好像是正常的CRUD操作,然後是管理命令,例如上面的索引。人們是否只是創建一個控制檯應用程序來管理和部署/運行與主應用程序分開?

+0

我知道這並不能回答你的問題,但我覺得值得一提的是,如果你願意,RavenDB會爲你自動創建索引。參見[這個RavenDB文檔頁面](http://ravendb.net/docs/client-api/querying),特別是關於動態索引的部分。 – ean5533

+0

@ ean5533 - 適用於動態索引,是的。我相信OP會關注靜態索引的創建。 –

回答

18

您不必檢查是否存在。服務器將自動比較您發送的索引定義並檢查它是否已經存在。如果存在一個具有相同名稱和定義的名稱,則將其單獨保留。如果存在一個名稱相同的名稱,但定義已更改,則刪除舊的名稱並創建新名稱。

通常人們會在應用程序啓動時在同一應用程序中創建索引。對於可能位於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 –