2012-11-17 28 views
8

Tôi muốn thay đổi Collation của toàn bộ cơ sở dữ liệu được tạo ra bởi mã ef đầu tiên, tôi cố gắng làm điều đó bằng cách chạy một kịch bản sau khi tạo nhưng nó không hoạt động,Làm thế nào để thay đổi/thiết lập đối chiếu trong EF Mã đầu tiên

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

Có thể đặt đối chiếu trước khi tạo cơ sở dữ liệu không?

Đó là ngoại lệ tôi nhận được:

Reset kết quả kết nối ở tiểu bang khác hơn đăng nhập ban đầu. Đăng nhập thất bại. Đăng nhập thất bại cho người dùng 'afi'. Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Các kết quả, nếu có, sẽ bị loại bỏ .

[SqlException (0x80131904): Đặt lại kết quả kết nối ở trạng thái khác là so với thông tin đăng nhập ban đầu. Đăng nhập thất bại.

Đăng nhập không thành công cho người dùng 'afi'. Đã xảy ra lỗi nghiêm trọng trên lệnh hiện tại. Kết quả, nếu có, phải được loại bỏ.]
System.Data.SqlClient.SqlConnection.OnError (SqlException ngoại lệ, 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
Hệ thống .Data.SqlClient.TdsParser.Run (Ru nBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader Datastream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +84
System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest (Byte [] đệm, yêu cầu TransactionManagerRequestType, String transactionName, TransactionManagerIsolationLevel isoLevel, thời gian chờ Int32 , SqlInternalTransaction giao dịch, TdsParserStateObject stateObj, Boolean isDelegateControlRequest) 1370
System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon (transactionRequest transactionRequest, string transactionName, IsolationLevel iso, 012.351.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: Đã xảy ra lỗi khi bắt đầu giao dịch trên kết nối nhà cung cấp. Xem ngoại lệ bên trong để biết chi tiết.]
System.Data.EntityClient.EntityConnection.BeginDbTransaction (IsolationLevel IsolationLevel) 4.298.876
System.Data.EntityClient.EntityConnection.BeginTransaction() +10
System.Data.Objects.ObjectContext.SaveChanges (SaveOptions tùy chọn) 538 System.Data.Entity.Internal.InternalContext .SaveChanges() +218 Afi.Domain.Storage.AfiDbContext.SaveChanges() trong c: \ inetpub \ wwwroot \ afi \ src \ Domain \ Storage \ AfiDbContext.cs: 190
Afi.Domain.Storage.EntitySession.Commit() trong c: \ inetpub \ wwwroot \ afi \ src \ Domain \ Storage \ EntitySession.cs: 54
Afi.Web.Controllers.CIController.Seed (Boolean excludeSomeData) trong c: \ inetpub \ wwwroot \ afi \ src \ Web \ Bộ điều khiển \ CIControll er.cs: 263
Afi.Web.Controllers.CIController.Index() trong c: \ inetpub \ wwwroot \ afi \ src \ Web \ Controllers \ CIController.cs: 89
lambda_method (Closure, ControllerBase, Object [ ]) 81
System.Web.Mvc.ReflectedActionDescriptor.Execute (controllerContext controllerContext, IDictionary thông số) +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 bước, Boolean & completedSynchronously) +288

+1

Bạn có biết rằng ngay cả khi bạn thay đổi đối chiếu trên cơ sở dữ liệu, bất kỳ đối tượng nào đã được tạo trước khi thay đổi sẽ tiếp tục đối chiếu? Nếu bạn có một bảng với 100 hàng trong đó. Họ sẽ giữ collation cũ trong khi các mục mới sẽ có collation mới. – twoleggedhorse

+0

Ngoài ra, khi bạn tạo một cơ sở dữ liệu và bạn không chỉ định đối chiếu, nó sẽ lấy collation của máy chủ. Máy chủ có được đặt thành French_CI_AI không? – twoleggedhorse

+0

chúng tôi muốn thay đổi collation giữa thời gian chúng ta tạo ra de database và thời gian EF Code Đầu tiên tạo các bảng nhưng chúng ta không biết làm thế nào để bảng trống rỗng – VinnyG

Trả lời

6

Một cách giải quyết có thể thực thi một lệnh sql để tạo ra cơ sở dữ liệu, chứ không phải là _dbContext.Database.CreateIfNotExists sử dụng();

_dbContext.Database.ExecuteSqlCommand ("

CREATE DATABASE [databasename] ON TIỂU (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%) đối chiếu French_CI_AI

");

Tôi đã đặt một khoảng cách nhỏ để dễ đọc hơn, rõ ràng là thay đổi tên databasename thành tên bạn muốn, cũng như PathToData và PathToLog.

Nếu bạn thay đổi collation của máy chủ sang French_CI_AI, tất cả cơ sở dữ liệu mới sẽ được tạo bằng cách sử dụng collation này, nhưng nó không phải lúc nào cũng là lựa chọn tốt nhất và sẽ gây đau đầu nếu bạn đang trong giai đoạn phát triển vì nó ảnh hưởng đến cơ sở dữ liệu temp_db. (các bảng tạm thời và các đối tượng tạm thời khác).

+0

Bạn có thể tạo tập lệnh bằng các bước sau trong ssms. Nhấp chuột phải vào thư mục cơ sở dữ liệu -> cơ sở dữ liệu mới. Thiết lập như thế nào bạn muốn và sau đó bấm vào biểu tượng kịch bản ở trên cùng (không phải là nút không sao). Chọn tùy chọn "Hành động tập lệnh cho cửa sổ truy vấn mới" để tạo sql của bạn. Bạn có thể bỏ qua hầu hết các thiết lập sau lệnh create dabase chính. – twoleggedhorse

+0

Nếu bạn lo lắng về các uglies trong workaround này bạn có thể dễ dàng đủ mở rộng mã để làm theo các công ước hiện có để xác định tên cơ sở dữ liệu và vị trí tệp db.Nếu không, bạn có nguy cơ vặn các nhà phát triển khác đang cố gắng xây dựng cục bộ hoặc cố gắng làm một điều gì đó không bình thường trong bản dựng của họ (như duy trì một vài DB khác nhau để thử nghiệm trên một dự án). –

+0

Đó là một giải pháp tốt nhưng tôi không hoàn toàn chắc chắn nếu đó là giải pháp cho vấn đề của tôi vì nó không được thực hiện bằng cách sử dụng EF. – VinnyG

0

chỉ thêm [] để cơ sở dữ liệu tên,

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

Đối với C# SqlConnection.ClearAllPools(); trước khi kết nối tiếp theo được bắt đầu hoạt động là tốt.

0

Nếu bạn muốn thay đổi collation của cơ sở dữ liệu hiện tại, bạn có thể sử dụng đoạn mã này

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

hoặc

_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