12

TLDR; Wie fügen Sie einen Volltextindex mithilfe von Entity-Framework hinzu? 5 codierte MigrationenVolltextindex innerhalb von Entity Framework erstellen Codierte Migrationen

Ich habe Probleme beim Hinzufügen eines Volltextindex zu einer Datenbank mithilfe von Entity-Framework-Migrationen. Es muss von Anfang an da sein, also versuche ich, die InitialCreate-Migration zu ändern, die automatisch generiert wurde, um sie hinzuzufügen.

Da es keine Möglichkeit gibt, dies über die DbMigrations API zu tun, habe ich auf inline sql am Ende des Up-Codes zurückgegriffen.

Sql("create fulltext catalog AppNameCatalog;"); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;"); 

Wenn diese läuft alles in Ordnung geschaffen wird, bis sie diese SQL erreicht, dann wirft er die die SQL-Fehler 'FULLTEXT- KATALOG Anweisung CREATE kann nicht innerhalb einer Benutzertransaktion verwendet werden. '. Welches erwartet wird und wie geplant funktioniert.

Zum Glück hat Sql() eine Überladung, mit der Sie die sql außerhalb der Migration Transaktion ausführen können. Genial! Ich dachte.

Sql("create fulltext catalog AppNameCatalog;", true); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;", true); 

Aber niedrig, und siehe den Code zu modifizieren, dies zu tun führt zu einem neuen Timeout-Fehler 'Timeout abgelaufen ist (siehe oben). Das Zeitlimit ist vor dem Abschluss des Vorgangs abgelaufen oder der Server reagiert nicht. '

Ich habe versucht, sql auszuspucken und es manuell ausgeführt und es funktioniert gut. Ich habe auch die generierte SQL mit und ohne es außerhalb einer Transaktion ausgeführt und sie sind identisch, so muss es etwas in der Art sein, wie SQL ausgeführt wird.

Vielen Dank im Voraus für jede Hilfe!

Antwort

7

Ich hatte ein ähnliches Problem. Meine InitialCreate-Migration erstellte eine Tabelle und versuchte dann, dieser Tabelle einen Volltextindex hinzuzufügen. Dabei wurde die überladene Sql() verwendet, um anzugeben, dass sie außerhalb der Transaktion ausgeführt werden muss. Ich habe auch einen Timeout-Fehler bekommen, und ich vermute, dass dies auf einen Thread-Deadlock zurückzuführen ist.

Ich könnte es in einigen Szenarios durch Verwendung von Sql() -Aufrufen anstelle von CreateTable() und durch die Zusammenführung der CREATE FULL TEXT CATALOG und CREATE FULL TEXT INDEX Anweisungen in einen einzigen Sql() -Aufruf erhalten. Dies war jedoch nicht sehr zuverlässig. Manchmal würde es funktionieren und manchmal würde es mit demselben Timeout-Fehler fehlschlagen.

Die einzige zuverlässige Lösung, die ich fand, war, die Erstellung des Katalogs und Volltextindex in eine separate Migration zu verschieben.

+0

Hey, danke für die Eingabe. Hat es dann als separate Migration funktioniert? –

+1

Yip, ich habe es funktioniert als separate Migration. Die Tabellenerstellung erfolgt in der InitialCreate-Migration, und der Volltextkatalog und die Indizes werden in einer separaten Migration erstellt, die nach der InitialCreate-Migration ausgeführt werden soll. – jspaey