【问题标题】:How to change/set collation in EF Code first如何首先在 EF 代码中更改/设置排序规则
【发布时间】:2012-11-17 18:04:30
【问题描述】:

我想先更改由ef代码创建的整个数据库的排序规则,我尝试通过在创建后运行脚本来做到这一点,但它不起作用,

_dbContext.Database.Delete();
_dbContext.Database.CreateIfNotExists();
_dbContext.Database.ExecuteSqlCommand("ALTER DATABASE afi COLLATE French_CI_AI");

是否可以在创建数据库之前设置排序规则?

这是我得到的例外:

重置连接会导致与初始状态不同的状态 登录。登录失败。用户“afi”登录失败。一个严重的错误 发生在当前命令上。结果,如果有的话,应该是 丢弃。

[SqlException (0x80131904): 重置连接会导致 与初始登录不同的状态。登录失败。

用户“afi”登录失败。当前出现严重错误 命令。结果(如果有)应丢弃。]
System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔型 breakConnection,Action`1 wrapCloseInAction) +388
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +688
System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) +4403
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +84
System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(字节 [] 缓冲区,TransactionManagerRequestType 请求,字符串 transactionName, TransactionManagerIsolationLevel isoLevel,Int32 超时, SqlInternalTransaction 事务,TdsParserStateObject stateObj, 布尔 isDelegateControlRequest) +1370
System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest,字符串 transactionName,IsolationLevel iso, SqlInternalTransaction 内部事务,布尔值 isDelegateControlRequest) +674
System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(隔离级别 iso,字符串事务名称)+547
System.Data.SqlClient.SqlInternalConnection.BeginTransaction(隔离级别 异)+18
System.Data.SqlClient.SqlConnection.BeginDbTransaction(隔离级别 隔离级别)+211
System.Data.EntityClient.EntityConnection.BeginDbTransaction(隔离级别 隔离级别)+155

[EntityException: 启动事务时发生错误 提供者连接。有关详细信息,请参阅内部异常。]
System.Data.EntityClient.EntityConnection.BeginDbTransaction(隔离级别 隔离级别)+4298876
System.Data.EntityClient.EntityConnection.BeginTransaction() +10
System.Data.Objects.ObjectContext.SaveChanges(SaveOptions 选项) +538 System.Data.Entity.Internal.InternalContext.SaveChanges() +218 Afi.Domain.Storage.AfiDbContext.SaveChanges() 在 c:\inetpub\wwwroot\afi\src\Domain\Storage\AfiDbContext.cs:190
Afi.Domain.Storage.EntitySession.Commit() 在 c:\inetpub\wwwroot\afi\src\Domain\Storage\EntitySession.cs:54
Afi.Web.Controllers.CIController.Seed(Boolean excludeSomeData) 在 c:\inetpub\wwwroot\afi\src\Web\Controllers\CIController.cs:263
Afi.Web.Controllers.CIController.Index() 在 c:\inetpub\wwwroot\afi\src\Web\Controllers\CIController.cs:89
lambda_method(闭包, ControllerBase, Object[]) +81
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) +261
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数)+39
System.Web.Mvc.Async.c_DisplayClass42.b_41() +34 System.Web.Mvc.Async.c_DisplayClass39.b_33() +124 System.Web.Mvc.Async.c_DisplayClass4f.b_49() +837307 System.Web.Mvc.Async.c_DisplayClass4f.b_49() +837307 System.Web.Mvc.Async.c_DisplayClass37.b_36(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.c_DisplayClass2a.b_20() +33 System.Web.Mvc.Async.c_DisplayClass25.b_22(IAsyncResult asyncResult) +837892
System.Web.Mvc.c_DisplayClass1d.b_18(IAsyncResult asyncResult) +28
System.Web.Mvc.Async.c_DisplayClass4.b_3(IAsyncResult ar) +15 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +65
System.Web.Mvc.Async.c_DisplayClass4.b_3(IAsyncResult ar) +15 System.Web.Mvc.Controller.EndExecute(IAsyncResult 异步结果)+51
System.Web.Mvc.c_DisplayClass8.b_3(IAsyncResult asyncResult) +42
System.Web.Mvc.Async.c_DisplayClass4.b_3(IAsyncResult ar) +15 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult 异步结果)+51
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

【问题讨论】:

  • 您是否知道,即使您更改了数据库的排序规则,在更改之前创建的任何对象都会保留该排序规则?如果您有一个包含 100 行的表。他们将保留旧的排序规则,而新条目将具有新的排序规则。
  • 另外,当你创建一个数据库并且你没有指定排序规则时,它会采用服务器的排序规则。服务器是否设置为 French_CI_AI?
  • 我们想更改创建数据库的时间和 EF Code First 创建表的时间之间的排序规则,但我们不知道如何使表应该为空
  • 服务器的排序规则是什么?在 SSMS 中,右键单击服务器并选择属性。在 General 下,您将看到条目“Server Collat​​ion”...
  • 服务器排序规则是 French_CI_AS 但我无法更改

标签: sql-server-2008 entity-framework-4.1 ef-code-first


【解决方案1】:

解决方法可能是执行 sql 命令来创建数据库,而不是使用 _dbContext.Database.CreateIfNotExists();

_dbContext.Database.ExecuteSqlCommand("

在 PRIMARY 上创建数据库 [databasename] ( NAME = N'databasename', 文件名 = N'c:\PathToData\databasename.mdf' , 大小 = 2048KB , FILEGROWTH = 1024KB) 登录 (NAME = N'databasename_log', FILENAME = N'c:\PathToLog\databasename_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) COLLATE French_CI_AI

");

为了便于阅读,我添加了一些间距,显然将 databasename 更改为您想要的名称,还有 PathToData 和 PathToLog。

如果您将服务器的排序规则更改为 French_CI_AI,所有新数据库都将使用此排序规则创建,但它并不总是最佳选择,并且如果您已经过了开发阶段,则会导致头疼,因为它也会影响 temp_db 数据库(临时表和其他临时对象)。

【讨论】:

  • 可以在ssms中按照以下步骤生成脚本。右键单击数据库文件夹-> 新数据库。设置您希望的方式,然后单击顶部的脚本图标(不是确定按钮)。选择“脚本操作到新的查询窗口”选项来生成你的 sql。您几乎可以忽略 main create dabase 命令之后的大部分设置。
  • 如果您担心此变通办法中的丑陋之处,您可以轻松地扩展代码以遵循现有约定来确定数据库名称和数据库文件位置。否则,您可能会搞砸其他开发人员,他们试图让本地构建运行或尝试在他们的构建中做一些稍微不寻常的事情(例如维护几个不同的数据库以在单个项目上进行测试)。
  • 这是一个很好的解决方案,但我不太确定它是否能解决我的问题,因为它不是使用 EF 完成的。
  • 您的解决方案中有 .edmx 文件吗?
【解决方案2】:

对于 c# SqlConnection.ClearAllPools();在启动下一个连接之前也可以正常工作。

【讨论】:

  • 谢谢,在实体框架 6 System.Data.SqlClient.SqlConnection.ClearAllPools(); 中尝试使用 ExecuteSqlCommand() 为数据库播种时,该行为我节省了很多时间
【解决方案3】:

只添加 [ ] 到名称数据库,

_dbContext.Database.ExecuteSqlCommand("ALTER DATABASE [afi] COLLATE French_CI_AI");

【讨论】:

    【解决方案4】:

    如果要改变当前数据库的排序规则,可以使用这个sn -p

    _dbContext.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
                            "ALTER DATABASE CURRENT COLLATE Cyrillic_General_CI_AS");
    

    _dbContext.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
                                string.Format("ALTER DATABASE [{0}] COLLATE Cyrillic_General_CI_AS", _dbContext.Database.Connection.Database));
    

    Alter Database in Entity Framework 6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2021-03-01
      • 2011-10-06
      相关资源
      最近更新 更多