12

TLDR;如何使用實體框架添加全文索引5代碼遷移在實體框架中創建全文索引編碼遷移

我遇到了使用實體框架遷移將全文索引添加到數據庫的問題。它需要從一開始就在那裏,所以我試圖修改自動生成的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語句不能在用戶事務內部使用。'。預期和按設計工作。

謝天謝地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的方式。

在此先感謝您的幫助!

回答

7

我有類似的問題。我的InitialCreate遷移正在創建一個表,然後嘗試向該表中添加一個全文索引,使用重載的Sql()來指示它需要在事務之外執行。我也得到一個超時錯誤,我懷疑這是由於線程死鎖。

我可以通過使用Sql()調用代替CreateTable()並通過將CREATE FULL TEXT CATALOG和CREATE FULL TEXT INDEX語句合併爲單個Sql()調用來使它在某些情況下工作。但是,這不是很可靠。有時候它會起作用,有時它會因爲超時錯誤而失敗。

我發現的唯一可靠解決方案是將目錄和全文索引的創建移動到單獨的遷移中。

+0

嘿,感謝您的意見。那麼它是否作爲單獨的遷移工作? – 2013-05-22 11:44:47

+1

葉,我已經把它作爲一個單獨的遷移工作。表的創建發生在InitialCreate遷移中,並且全文本目錄和索引是在InitialCreate遷移後要執行的單獨遷移中創建的。 – jspaey 2013-05-22 15:04:11