Создайте полнотекстовый индекс в Entity Framework Coded Migrations

TLDR; Как добавить полнотекстовый индекс с помощью закодированных миграций Entity framework 5

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

Поскольку нет способа сделать это через API DbMigrations, я прибегал к запуску встроенного sql в конце кода «Up».

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 expired. Время ожидания истекло до завершения операции или сервер не отвечает.'

Я попытался выплюнуть sql и запустить его вручную, и он отлично работает. Я также различал сгенерированный sql с запуском и без него вне транзакции, и они идентичны, поэтому это должно быть что-то в способе выполнения sql.

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


person Tom Riley    schedule 14.05.2013    source источник


Ответы (1)


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

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

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

person jspaey    schedule 22.05.2013
comment
Эй, спасибо за вклад. Тогда это работало как отдельная миграция? - person Tom Riley; 22.05.2013
comment
Да, у меня это работает как отдельная миграция. Создание таблицы происходит при миграции InitialCreate, а полнотекстовый каталог и индексы создаются при отдельной миграции, которую предполагается выполнить после миграции InitialCreate. - person jspaey; 22.05.2013