如何在RavenDB中以编程方式创建索引?
我试图遵循这个example。
这是我的索引创建者:
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中创建索引?我创建索引的方式是否正确?
答案 0 :(得分:5)
试试这个: 在商店对象中指定数据库名称
var store = new Raven.Client.Document.DocumentStore
{
Url = "http://localhost:8080",
DefaultDatabase = "MyDB"
};
答案 1 :(得分: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);
}
以与调用其他方法相同的方式调用它,但现在您可以将数据库名称作为参数传递。