2012-11-17 48 views
8

我想改變由EF代碼首先創建整個數據庫的整理,我試圖通過運行在創建後一個腳本來做到這一點,但它不工作,如何更改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,布爾callerHasConnectionLock,布爾asyncClose)688
System.Data.SqlClient.TdsParser.TryRun(runBehavior runBehavior, 的SqlCommand cmdHandler,SqlDataReader的數據流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布爾& dataReady)4403
系統.Data.SqlClient.TdsParser.Run(RU nBehavior 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, SqlInternalTransaction internalTransaction,布爾 isDelegateControlRequest)674
System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(的IsolationLevel 異,字符串transactionName)547
System.Data.SqlClient.SqlInternalConnection.BeginTransaction(的IsolationLevel 異)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 \ Domain \ Storage \ AfiDbContext.cs:190
Afi.Domain.Storage.EntitySession.Commit ()在 C:\的Inetpub \ wwwroot的\ AFI \ SRC \域\存儲\ EntitySession.cs:54
Afi.Web.Controllers.CIController.Seed(布爾excludeSomeData)在 C:\的Inetpub \ wwwroot的\ AFI \ SRC \網絡\控制器\ CIControll er.cs:263
Afi.Web.Controllers.CIController.Index()在 C:\的Inetpub \ wwwroot的\ AFI \ SRC \網絡\控制器\ CIController.cs:89
lambda_method(封閉,ControllerBase,對象[ ])81
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary的參數)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步驟,布爾& completedSynchronously)288

+1

你知道,即使您更改排序規則數據庫,在更改之前創建的任何對象都會持續排序?如果你有一個100行的表格。他們將保留舊的整理,而新的條目將具有新的整理。 – twoleggedhorse

+0

另外,當您創建數據庫並且不指定排序規則時,它將採用服務器的排序規則。服務器是否設置爲French_CI_AI? – twoleggedhorse

+0

我們希望更改創建數據庫的時間和EF編碼之間的排序規則。首先創建表格,但我們不知道表格應該如何排空 – VinnyG

回答

6

一種解決方法可以是,以執行SQL命令來創建數據庫,而不是使用_dbContext.Database.CreateIfNotExists();

_dbContext.Database.ExecuteSqlCommand(」

CREATE DATABASE [數據庫名稱] 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數據庫(臨時表和其他臨時對象)。

+0

您可以通過以下步驟在ssms中生成腳本。右鍵單擊數據庫文件夾 - >新建數據庫。設置你的想法,然後點擊頂部的腳本圖標(不是OK按鈕)。選擇「腳本動作到新的查詢窗口」選項來生成你的SQL。在主create dabase命令後,幾乎可以忽略大部分設置。 – twoleggedhorse

+0

如果您擔心這種解決方法中的醜陋,您可以輕鬆擴展代碼以遵循現有約定來確定數據庫名稱和數據庫文件位置。否則,你會冒險搞砸其他開發者試圖獲得本地構建,或者試圖在構建中做一些不尋常的事情(比如在一個項目中維護幾個不同的DB)。 –

+0

這是一個很好的解決方案,但我不太確定它是否是我的問題的解決方案,因爲它不是使用EF完成的。 – VinnyG

0

僅添加[]到名稱數據庫,

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

爲C#SqlConnection.ClearAllPools();在啓動下一個連接之前也是如此。

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