在Entity Framework Coded Migrations中创建全文索引

时间:2013-05-14 14:48:15

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

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

我在使用Entity框架迁移向数据库添加全文索引时遇到问题。它需要从一开始就在那里,所以我正在尝试修改自动生成的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);

但是低并且看到修改代码来执行此操作(参见上文)会导致新的超时错误' Timeout过期。操作完成之前经过的超时时间或服务器没有响应。'

我已经尝试吐出sql并手动运行它并且工作正常。我也使用和不在事务外运行生成的sql来区分生成的sql并且它们是相同的所以它必须是sql执行方式的东西。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

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

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

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