2013-07-02 92 views
3

如何在RavenDB中以編程方式創建索引?以編程方式創建索引

我試着按照這個。

這是我的索引創建:

public class MyIndex : Raven.Client.Indexes.AbstractIndexCreationTask<MyEntity> 
{ 
    public MyIndex() 
    { 
     Map = col => col.Select(c => new 
     { 
      code = c.Code, 
      len = c.Code.Length, 
      sub = c.Code.Substring(0, 1) 
     }); 
    } 
} 

這裏是來電者:

var store = new Raven.Client.Document.DocumentStore 
{ 
    Url = "http://localhost:8080" 
}; 
store.Initialize(); 

try 
{ 
    using (var session = store.OpenSession("MyDB")) 
    { 
     Raven.Client.Indexes.IndexCreation.CreateIndexes(
      typeof(MyIndex).Assembly, store); 
    } 
} 
finally 
{ 
    store.Dispose(); 
} 

該指數創建,但不是在MYDB但在系統數據庫中。

如何在MyDB中創建索引?我創建索引的方式是否正確?

回答

5

試試這個: 在你的存儲對象指定數據庫名稱

var store = new Raven.Client.Document.DocumentStore 
{ 
    Url = "http://localhost:8080", 
    DefaultDatabase = "MyDB" 
}; 
4

由於MED指出的那樣,你可以連接到文檔存儲時提供一個默認的數據庫。這樣做時,不再將數據庫名稱傳遞給OpenSession方法。這是最簡單的方法,如果你正在使用單個數據庫,那麼它是最好的答案(並且應該給予信用作爲這個問題的答案)。

但是,如果您需要使用多個數據庫,並因此無法使用該技術,那麼您可以使用此輔助方法。

public static void CreateIndexes(Assembly assembly, IDocumentStore store, 
                string databaseName) 
{ 
    var catalog = new AssemblyCatalog(assembly); 
    var provider = new CompositionContainer(catalog); 
    var commands = store.DatabaseCommands.ForDatabase(databaseName); 
    IndexCreation.CreateIndexes(provider, commands, store.Conventions); 
} 

以與調用其他方法相同的方式調用它,但現在可以將數據庫名稱作爲參數傳遞。

+0

我得到一個錯誤,提供者的SourceProvider在烏鴉2375中爲空。現在研究這個...讓我知道你是否有這方面的細節。 – Steve

+0

var provider = new CatalogExportProvider(catalog) { SourceProvider = new CatalogExportProvider(catalog) }; 解決了我的問題並創建了索引。 – Steve

+0

@Steve - 感謝您的支持。不知道我上次遇到錯誤,但現在已修復。你的方式也不錯,但是我編輯的代碼只是少寫代碼,而且Raven在自己的'CreateIndexes'方法中做了什麼。 –