在Entity Framework的编码迁移中创建全文索引

14

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

我在使用Entity Framework迁移时遇到了问题,尝试为数据库添加全文索引。这需要从一开始就存在,因此我正在尝试修改自动生成的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 statement cannot be used inside a user transaction.'。这是预期的,并且按设计工作。

幸运的是,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);

但是修改代码以执行此操作(请参见上文)会导致一个新的超时错误'Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.'

我已经尝试将 SQL 语句输出并手动运行,它可以正常工作。我还比较了生成的 SQL 语句在事务内外运行的差异,发现它们是相同的,因此问题一定与执行 SQL 的方式有关。

提前感谢您的任何帮助!

1个回答

7
我曾经遇到了一个类似的问题。我的InitialCreate迁移创建了一个表格,然后试图给该表格添加一个全文索引,使用重载的Sql()方法表示需要在事务外执行。我也遇到了超时错误,我认为这是由于线程死锁导致的。
通过使用Sql()调用而不是CreateTable(),并将CREATE FULL TEXT CATALOG和CREATE FULL TEXT INDEX语句合并为单个Sql()调用,我可以使它在某些情况下工作。然而,这并不是非常可靠的。有时它会起作用,有时它会因为同样的超时错误而失败。
我发现唯一可靠的解决方案是将目录和全文索引的创建移到单独的迁移中。

嘿,感谢您的输入。它作为单独的迁移工作了吗? - Tom Riley
1
是的,我已经将其作为单独的迁移工作。表的创建发生在InitialCreate迁移中,全文目录和索引则在另一个迁移中创建,该迁移旨在在InitialCreate迁移之后执行。 - jspaey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接