13

TLDR; エンティティ フレームワーク 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 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);

しかし、これを行うためにコードを変更すると (上記を参照)、新しいタイムアウト エラー 'タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。'

私はSQLを吐き出して手動で実行しようとしましたが、うまくいきました。また、生成されたSQLをトランザクションの外部で実行する場合と実行しない場合で比較しましたが、それらは同一であるため、SQLが実行される方法にあるに違いありません。

助けてくれてありがとう!

4

1 に答える 1

7

同様の問題がありました。私の InitialCreate 移行では、テーブルを作成し、オーバーロードされた Sql() を使用して、トランザクションの外部で実行する必要があることを示して、そのテーブルにフルテキスト インデックスを追加しようとしていました。タイムアウト エラーも発生していましたが、スレッドのデッドロックが原因であると思われます。

CreateTable() の代わりに Sql() 呼び出しを使用し、CREATE FULL TEXT CATALOG ステートメントと CREATE FULL TEXT INDEX ステートメントを単一の Sql() 呼び出しにマージすることで、いくつかのシナリオで動作させることができました。しかし、これはあまり信頼できませんでした。うまくいく場合もあれば、同じタイムアウト エラーで失敗する場合もあります。

私が見つけた唯一の信頼できる解決策は、カタログと全文索引の作成を別の移行に移すことでした。

于 2013-05-22T11:35:51.520 に答える