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