2012-12-12 29 views
8

Wie überprüfe ich, ob ein Index existiert? - vor dem Aufruf:RavenDb prüfen, ob Index existiert

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

Alle Beispiele, die ich gesehen habe (einschließlich der in dem Beispielprojekt) hatte den Index neu erstellt jedes Mal, wenn der Client gestartet wird, die nicht richtig zu sein scheinen.

Auch was ist die allgemeine Strategie? Es scheint, als ob es die normale CRUD-Operation gibt, dann gibt es Administrationsbefehle wie das oben genannte. Erstellen Leute einfach eine Konsolen-App, die den Admin ausführt und diese separat von der Haupt-App bereitstellt/ausführt?

+0

Ich weiß, dass dies Ihre Frage nicht beantwortet, aber ich fand es erwähnenswert, dass RavenDB automatisch Indizes für Sie erstellt, wenn Sie es zulassen. Siehe [diese RavenDB-Dokumentseite] (http://ravendb.net/docs/client-api/querying) und speziell den Teil über dynamische Indizes. – ean5533

+0

@ ean5533 - das gilt für dynamische Indizes, ja. Ich glaube, das OP ist besorgt über die Erstellung von statischen Indizes. –

Antwort

18

Sie müssen nicht auf Vorhandensein prüfen. Der Server vergleicht automatisch die von Ihnen gesendete Indexdefinition und prüft, ob sie bereits existiert. Wenn einer mit dem gleichen Namen und der gleichen Definition existiert, wird er alleine gelassen. Wenn einer mit demselben Namen existiert, aber die Definition sich geändert hat, wird der alte gelöscht und der neue erstellt.

Normalerweise würde man Indizes in der gleichen Anwendung beim Start der Anwendung erstellen. Für Web-Apps, die in global.asax und für Konsolen-/Desktop-Apps verwendet werden können, wäre dies nur der erste Teil des Startup-Codes.

Aber manchmal ist das nicht möglich, zum Beispiel wenn Sie viele verschiedene Datenbanken haben, wie es oft Multi-Tenant-Anwendungen tun. In diesen Fällen würden Sie Indizes erstellen, wenn Sie jede Tenant-Datenbank erstellen, und Sie müssen möglicherweise beim Rollout eines Versionsupgrades weitere Indizes aktualisieren oder erstellen.

Auch sollte ich erwähnen, dass Sie Indizes ein paar verschiedene Möglichkeiten erstellen können.

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

Es gibt ein paar andere, aber Sie bekommen die Idee.

Und gründlich zu sein, wenn Sie Index existance wirklich für hat überprüfen möchten, können Sie verwenden:

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

Aber das wird nur dem Namen nach überprüfen, nicht per Definition. Und du brauchst es nicht.

+0

danke für die Erklärung. Ich hatte einen "Aha-Moment" nachdem ich das gelesen hatte! – trailmax

+0

Dieser Rat scheint nicht richtig zu sein. Wenn ich PutIndex auf einem Index anrufe, der bereits existiert, erhalte ich eine InvalidOperationException - Index existiert bereits. Ich benutze v2.5. Mache ich etwas falsch ? – Chris

+2

Sie haben eine Option, um es durch Einstellungen 3. Argument zu true zu überschreiben –

Verwandte Themen