2012-12-12 47 views
8

Come faccio a verificare se esiste un indice? - prima di chiamare:RavenDb verifica se l'indice esiste

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

Tutti gli esempi che ho visto (compresi quelli del progetto di esempio) avevano l'indice ricreato ogni volta che si avvia il cliente, che non mi sembra giusto.

Anche qual è la strategia generale? Sembra che ci sia la normale operazione CRUD, poi ci sono i comandi di amministrazione come quello di indicizzazione sopra. Le persone creano semplicemente un'app console che esegue l'amministrazione e la distribuiscono/eseguono separatamente dall'app principale?

+0

So che questo non risponde alla tua domanda, ma ho sentito che valeva la pena ricordare che RavenDB crea automaticamente degli indici per te se lo fai. Vedi [questa pagina di documentazione di RavenDB] (http://ravendb.net/docs/client-api/querying) e specialmente la parte relativa agli indici dinamici. – ean5533

+0

@ ean5533 - che si applica agli indici dinamici, sì. Credo che l'OP si preoccupi della creazione di indici statici. –

risposta

18

Non è necessario verificare l'esistenza. Il server confronterà automaticamente la definizione dell'indice che invii e controllerà per vedere se esiste già. Se ne esiste uno con lo stesso nome e definizione, viene lasciato in pace. Se uno esiste con lo stesso nome, ma la definizione è cambiata, il vecchio viene eliminato e viene creato il nuovo.

Generalmente si creano indici nella stessa applicazione all'avvio dell'applicazione. Per le app Web che potrebbero essere in global.asax e per le app console/desktop, sarebbe solo la prima parte del codice di avvio.

Ma a volte ciò non è possibile, ad esempio se si dispone di molti database diversi, come spesso accade con le applicazioni multi-tenant. In questi casi, crei gli indici quando crei ciascun database tenant e potresti dover aggiornare o creare più indici quando esegui un aggiornamento della versione.

Inoltre, dovrei ricordare che è possibile creare indici in diversi modi.

// 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()); 

Ci sono pochi altri, ma l'idea è stata presa.

E tanto per essere approfondita, se davvero hai desidera controllare per l'indice di esistenza, è possibile utilizzare:

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

Ma che controllerà solo di nome, non per definizione. E non ne hai bisogno.

+0

grazie per la spiegazione. Ho avuto un "momento aha" dopo aver letto questo! – trailmax

+0

Questo consiglio non sembra giusto. Se chiamo PutIndex su un indice già esistente sto ricevendo un InvalidOperationException - L'indice esiste già. Sto usando v2.5. Sto facendo qualcosa di sbagliato ? – Chris

+2

hai la possibilità di sovrascriverlo impostando il terzo argomento su true –