【问题标题】:Create fulltext index within Entity Framework Coded Migrations在实体框架编码迁移中创建全文索引
【发布时间】:2013-05-08 22:04:30
【问题描述】:

TLDR;如何使用 Entity Framework 5 编码迁移添加全文索引

我在使用实体框架迁移向数据库添加全文索引时遇到问题。它需要从一开始就在那里,所以我正在尝试修改自动生成的 InitialCreate 迁移以添加它。

由于没有办法通过 DbMigrations API 来实现,我只好在“Up”代码的末尾运行内联 sql。

Sql("create fulltext catalog AppNameCatalog;");
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;");

当它运行时,一切都被创建得很好,直到它到达这个 sql,然后它抛出 sql 错误'CREATE FULLTEXT CATALOG 语句不能在用户事务中使用。'。这是预期的并按设计工作。

幸好 Sql() 有一个重载,允许您在迁移事务之外运行 sql。惊人的!我想。

Sql("create fulltext catalog AppNameCatalog;", true);
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;", true);

但是修改代码以执行此操作(见上文)会导致新的超时错误'超时已过期。在操作完成之前超时时间已过或服务器没有响应。'

我试过吐出 sql 并手动运行它,它工作正常。我还区分了在事务之外运行和不运行生成的 sql,它们是相同的,所以它一定是 sql 的执行方式。

提前感谢您的帮助!

【问题讨论】:

    标签: entity-framework-5 entity-framework-migrations full-text-indexing


    【解决方案1】:

    我遇到了类似的问题。我的 InitialCreate 迁移正在创建一个表,然后尝试向该表添加一个全文索引,使用重载的 Sql() 来指示它需要在事务之外执行。我也遇到了超时错误,我怀疑这是由于线程死锁造成的。

    通过使用 Sql() 调用而不是 CreateTable() 并将 CREATE FULL TEXT CATALOG 和 CREATE FULL TEXT INDEX 语句合并到单个 Sql() 调用中,我可以让它在某些情况下工作。然而,这并不是很可靠。有时它会工作,有时它会因相同的超时错误而失败。

    我找到的唯一可靠的解决方案是将目录和全文索引的创建移到单独的迁移中。

    【讨论】:

    • 您好,感谢您的意见。那么它是否作为单独的迁移工作?
    • 是的,我已经把它作为一个单独的迁移工作了。表创建发生在 InitialCreate 迁移中,全文目录和索引是在单独的迁移中创建的,该迁移旨在在 InitialCreate 迁移之后执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2018-03-07
    • 1970-01-01
    • 2018-10-07
    • 2015-05-11
    相关资源
    最近更新 更多