我有一个MVC5
项目,我通过Entity Framework 6 - Code First
迁移将我的表填充到数据库中。在查看表格时,我认为某些字符无法正确显示,Database Collation
为SQL_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)?
任何帮助将不胜感激......
答案 0 :(得分: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
参数。您可能应该在单个事务中运行此操作,以防某些步骤失败。