【问题标题】:RavenDb check if index existsRavenDb 检查索引是否存在
【发布时间】:2012-11-30 17:37:52
【问题描述】:

如何检查索引是否存在? - 打电话之前:

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

我见过的所有示例(包括示例项目中的示例)每次启动客户端时都会重新创建索引,这似乎不正确。

还有什么总体策略?似乎有正常的 CRUD 操作,然后有管理命令,例如上面的索引。人们是否只是创建一个控制台应用程序来执行管理员并与主应用程序分开部署/运行它?

【问题讨论】:

  • 我知道这并不能回答您的问题,但我觉得值得一提的是,如果您允许,RavenDB 会自动为您创建索引。请参阅this RavenDB doc page,尤其是关于动态索引的部分。
  • @ean5533 - 适用于动态索引,是的。我相信 OP 关心静态索引的创建。

标签: c# indexing ravendb


【解决方案1】:

您不必检查是否存在。服务器将自动比较您发送的索引定义并检查它是否已经存在。如果存在具有相同名称和定义的一个,则将其单独放置。如果存在同名但定义已更改,则删除旧的并创建新的。

通常会在应用程序启动时在同一个应用程序中创建索引。对于可能在 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

但这只会按名称检查,而不是按定义检查。而且你不需要它。

【讨论】:

  • 感谢您的解释。读完这篇文章后,我有一个“啊哈时刻”!
  • 这个建议似乎不对。如果我在已经存在的索引上调用 PutIndex,则会收到 InvalidOperationException - 索引已存在。我正在使用 v2.5。我做错什么了吗?
  • 您可以选择通过将第三个参数设置为 true 来覆盖它
【解决方案2】:

对主要和隐含问题的当代答案 (RavenDB v4.x) 将是:

如何检查索引是否存在?

无法检查特定索引,但您可以获得所有索引的列表(请参阅official docs),如下所示

IndexDefinition[] indexes = store.Maintenance.Send(new GetIndexesOperation(0, 100));

如何迁移数据库?

是的,您可以在每次启动应用时运行索引创建。它适用于小型应用程序,如果不需要更改,速度很快(请参阅official docs):

IndexCreation.CreateIndexes(typeof(YourClass).Assembly, _store);

但是,对于更大的应用程序,我鼓励您创建一个迁移过程(单独的工具或应用程序中的另一个端点)来处理:

  • 索引错误(例如,查看story of LINQ gotchas)。如果索引失败,可能会发生索引错误,并且某些记录可能会从查询结果中掉出来。尽快收到有关索引错误的通知。请参阅文档中的“How to Get Index Errors”。
  • 有适当的迁移过程。许多数据库修改可能需要执行迁移脚本,随后需要数据库版本控制,确保您运行正确的版本等。请查看RavenMigrations NuGet 包。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 2015-09-16
    • 2013-05-28
    • 2010-09-20
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多