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

时间:2012-11-17 18:04:30

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

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

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

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

这是我得到的例外:

  

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

     

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

     

用户'登录失败。电流发生严重错误   命令。如果有的话,结果应该被丢弃。]
  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,布尔& dataReady)+4403
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,   SqlCommand cmdHandler,SqlDataReader dataStream,   BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject   stateObj)+84
  System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(字节[]   buffer,TransactionManagerRequestType请求,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(的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选项)   +538 System.Data.Entity.Internal.InternalContext.SaveChanges()+218 Afi.Domain.Storage.AfiDbContext.SaveChanges()in   C:\的Inetpub \ wwwroot的\ AFI \ SRC \域\存储\ AfiDbContext.cs:190
  Afi.Domain.Storage.EntitySession.Commit()in   C:\的Inetpub \ wwwroot的\ AFI \ SRC \域\存储\ EntitySession.cs:54
  Afi.Web.Controllers.CIController.Seed(布尔excludeSomeData)中   C:\的Inetpub \ wwwroot的\ AFI的\ src \网络\ \控制器CIController.cs:263
  Afi.Web.Controllers.CIController.Index()in   C:\的Inetpub \ wwwroot的\ AFI的\ src \网络\ \控制器CIController.cs:89
  lambda_method(Closure,ControllerBase,Object [])+81
  System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext   controllerContext,IDictionary 2 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   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 个答案:

答案 0 :(得分: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)登录(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数据库(临时表和其他临时对象)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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));

Alter Database in Entity Framework 6