Создание полнотекстового индекса в рамках кодированных миграций Entity Framework

TL;DR; Как добавить полный текстовый индекс, используя кодировку Entity framework 5 закодированные миграции

У меня возникают проблемы с добавлением полного текстового индекса в базу данных с использованием миграции структуры Entity. Он должен быть с самого начала, поэтому я пытаюсь изменить миграцию InitialCreate, которая была автоматически сгенерирована для ее добавления.

Так как нет способа сделать это через DbMigrations API, я прибегал к выполнению встроенного 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 не может использоваться внутри пользовательской транзакции. '. Ожидается, что он будет работать.

К счастью, 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.

Заранее благодарим за помощь!

Ответ 1

У меня была аналогичная проблема. Моя миграция InitialCreate создала таблицу, а затем попыталась добавить в эту таблицу полный текстовый индекс, используя перегруженный Sql(), чтобы указать, что он должен выполняться вне транзакции. Я также получал ошибку таймаута, и я подозреваю, что это связано с тупиком потока.

Я мог бы заставить его работать в некоторых сценариях, используя вызовы Sql() вместо CreateTable() и объединив CREATE FULL TEXT CATALOGUE и CREATE FULL TEXT INDEX в один вызов Sql(). Однако это было не очень надежным. Иногда он работал бы, и иногда он терпел неудачу с той же ошибкой тайм-аута.

Единственное надежное решение, которое я нашел, - это перемещение создания каталога и полного текстового индекса в отдельную миграцию.