9

我想首先更改由 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 exception, Boolean 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 dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4403
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +84
System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel , Int32 超时, SqlInternalTransaction 事务, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) +1370
System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest) +674
System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName) +547
System.Data.SqlClient.SqlInternalConnection.BeginTransaction(IsolationLevel iso) +18
System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevelisolationLevel) +211
系统。 Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel 隔离级别) +155

[EntityException:在提供程序连接上启动事务时发生错误。详情见内部异常。]
System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevelisolationLevel) +4298876
System.Data.EntityClient.EntityConnection.BeginTransaction() +10
System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) + 538 System.Data.Entity.Internal.InternalContext.SaveChanges() +218 Afi.Domain.Storage.AfiDbContext.SaveChanges() 在 c:\inetpub\wwwroot\afi\src\Domain\Storage\AfiDbContext.cs:190
Afi。 c:\inetpub\wwwroot\afi\src\Domain\Storage\EntitySession.cs:54 中的 Domain.Storage.EntitySession.Commit()
C:\inetpub\wwwroot\afi\src\Web\Controllers\CIController.cs:263
Afi.Web.Controllers.CIController.Seed(Boolean excludeSomeData) 在 c:\inetpub \wwwroot\afi\src\Web\Controllers\CIController.cs:89
lambda_method(Closure, ControllerBase, Object[]) +81
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, 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.b2 parameters) +261
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary

_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 asyncResult) +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 asyncResult) +51
System.Web。 CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

4

4 回答 4

6

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

_dbContext.Database.ExecuteSqlCommand("

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

");

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

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

于 2012-12-14T10:24:06.943 回答
1

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

于 2015-01-29T22:59:03.070 回答
0

仅将 [ ] 添加到名称数据库,

_dbContext.Database.ExecuteSqlCommand("ALTER DATABASE [afi] COLLATE French_CI_AI");
于 2013-09-09T22:08:42.590 回答
0

如果要更改当前数据库的排序规则,可以使用此代码段

_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));

在实体框架 6 中更改数据库

于 2015-10-13T12:04:53.683 回答