1

我有一個MVC5項目,我通過Entity Framework 6 - Code First遷移將我的表填充到數據庫。查看錶格時,我認爲有些字符顯示不正確,而Database CollationSQL_Latin1_General_CP1_CI_AS而不是French_CI_AS遷移後更改數據庫整理?

1)應該如何設置Database Collation通過Code First創建數據庫?我在下面找到了以下方法,但不確定它是否是此目的的最佳選擇?

public override void Up() 
{ 
    Sql("ALTER DATABASE [YourDB] COLLATE [YourCollation]", suppressTransaction: true); 
    [...Your DB Objects Creation codes here...] 
} 

在另一方面,使用這個腳本的時候,我遇到「ALTER DATABASE失敗。數據庫的默認排序規則‘DBNAME’不能設置爲French_CI_AS」錯誤。

2)是否可以在向相關表中添加一些數據後更改Database Collation(通過Code First或SQL)?

任何幫助,將不勝感激...

回答

2

即使添加數據後,應該可以更改排序規則。我猜你的問題來自於你需要在執行排序規則更改時將數據庫置於單用戶模式。數據庫必須被鎖定以防止其他連接使用它。完成後,恢復多用戶模式。

如果這是你的情況下,你應該除了你在你的問題顯示出一個越來越此錯誤:

數據庫無法獨佔鎖定來執行操作。

遷移代碼來解決它:

public override void Up() 
{ 
    Sql("ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;"); 

    Sql("ALTER DATABASE [YourDB] COLLATE [YourCollation];"); 

    Sql("ALTER DATABASE [YourDB] SET MULTI_USER;"); 

    [...Your DB Objects Creation codes here...] 
} 

我想你應該刪除supressTransaction參數。您應該在單個事務中運行此操作,以防某些步驟失敗。

+0

非常感謝。只是一個問題:**什麼是supressTransaction **準確和**什麼時候應該設置爲true和false **?你能多解釋一下嗎? – hexadecimal

+0

從[msdn參考頁](https://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigration.sql(v = vs.113).aspx):'suppressTransaction': 「一個值指示SQL是否應該在用於遷移過程的事務之外執行,如果沒有提供任何值,則SQL將在事務中執行。」一般而言,您希望遷移中的所有語句都作爲事務運行,否則如果出現問題,您將無法安全地重複執行遷移。當我想將它設置爲「true」時,我從未發現過一個場景。 – Diana

+0

Bueno,muchas gracias Senorita :) – hexadecimal