如何首先在EF代码中更改/设置排序规则

Vin*_*nyG 9 sql-server-2008 ef-code-first entity-framework-4.1

我想首先更改由ef代码创建的整个数据库的Collat​​ion,我尝试通过在创建后运行脚本来实现它,但它不起作用,

_dbContext.Database.Delete();
_dbContext.Database.CreateIfNotExists();
_dbContext.Database.ExecuteSqlCommand("ALTER DATABASE afi COLLATE French_CI_AI");
Run Code Online (Sandbox Code Playgroud)

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

这是我得到的例外:

重置连接会导致与初始登录不同的状态.登录失败.用户'afi'登录失败.当前命令发生严重错误.结果(如果有的话)应该被丢弃.

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

用户'afi'登录失败.当前命令发生严重错误.结果(如果有的话)应该被丢弃.]
System.Data.SqlClient.SqlConnection.OnError(SqlException异常,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 timeout,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(IsolationLevel isolationLevel)+211
System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)+155

[EntityException:在提供程序连接上启动事务时发生错误.有关详细信息,请参阅内部异常.]
System.Data.EntityClient.EntityConnection.BeginDbTransaction(IsolationLevel isolationLevel)+4298876
System.Data.EntityClient.EntityConnection.BeginTransaction()+10
System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)+ 538 System.Data.Entity.Internal.InternalContext.SaveChanges()+ 218在c:\ inetpub\wwwroot\afi\src\Domain\Storage\AfiDbContext.cs:190
Afi中的Afi.Domain.Storage.AfiDbContext.SaveChanges(). C:\ inetpub\wwwroot\afi\src\Domain\Storage\EntitySession.cs中的Domain.Storage.EntitySession.Commit():54
c:\ inetpub\wwwroot\afi\src\Web\Controllers\CIController.cs中的Afi.Web.Controllers.CIController.Seed(布尔excludeSomeData):263
在c:\ inetpub中的Afi.Web.Controllers.CIController.Index()\wwwroot\afi\src\Web\Controllers\CIController.cs:89
lambda_method(Closure,ControllerBase,Object [])+81
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters)+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

two*_*rse 6

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

_dbContext.Database.ExecuteSqlCommand("

CREATE DATABASE [databasename] ON PRIMARY(NAME = N'databasename',FILENAME = N'c:\ PathToData\databasename.mdf',SIZE = 2048KB,FILEGROWTH = 1024KB)LOG ON(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数据库(临时表和其他临时对象).