2012-11-17 11 views
8

मैं पहली बार एफई कोड द्वारा बनाई पूरे डेटाबेस का मिलान को बदलना चाहते हैं, मैं निर्माण के बाद चल रही स्क्रिप्ट के द्वारा ऐसा करने की कोशिश, लेकिन यह नहीं काम करता है,बदलने के लिए एफई संहिता में/सेट मिलान पहले

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

क्या डेटाबेस बनाने से पहले संयोजन स्थापित करना संभव है?

अपवाद मैं मिलता है कि:

प्रारंभिक लॉगिन तुलना में एक अलग राज्य में कनेक्शन परिणाम रीसेट करना। लॉगिन विफल रहता है। लॉग इन उपयोगकर्ता 'afi' के लिए विफल रहा। एक गंभीर त्रुटि वर्तमान कमांड पर हुई। परिणाम, अगर कोई है, छोड़ दिया जाना चाहिए।

[एसक्लएक्सप्सेप्शन (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 dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, बूलियन & dataReady) 4403
सिस्टम .Data.SqlClient.TdsParser.Run (आरयू nBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DataStream, 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 iso, 012,351,SqlInternalTransaction internalTransaction, बूलियन isDelegateControlRequest) 674
System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction (IsolationLevel iso, स्ट्रिंग 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) 4,298,876
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() सी में: \ inetpub \ wwwroot \ afi \ src \ Domain \ Storage \ AfiDbContext.cs: 190
Afi.Domain.Storage.EntitySession.Commit() सी: \ inetpub \ wwwroot \ afi \ src \ Domain \ Storage \ EntitySession.cs: 54
Afi.Web.Controllers.CIController.Seed (Boolean बहिष्कृत सोमैडाटा) सी में: \ inetpub \ wwwroot \ afi \ src \ वेब \ नियंत्रकों \ CIControll er.cs: 263
Afi.Web.Controllers.CIController.Index() C: \ inetpub \ wwwroot \ एएफआई \ src \ वेब \ नियंत्रकों \ CIController.cs: 89
lambda_method (बंद, ControllerBase, वस्तु [ ]) +81
System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary पैरामीटर) +39
System.Web.Mvc.Async। <> सी_ DisplayClass42.b _41() +34 सिस्टम.Web.Mvc.Async। <> सी_ DisplayClass39.b _33() +124 सिस्टम.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। <> सी_ DisplayClass2a.b _20() +33 सिस्टम.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 ए आर) 15 System.Web.Mvc.Controller.EndExecuteCore (IAsyncResult asyncResult) +65
System.Web.Mvc.Async। <> c_ DisplayClass4.b _3 (IAsyncResult ए आर) 15 System.Web.Mvc.Controller.EndExecute (IAsyncResult asyncResult) +51
System.Web.Mvc। <> सी_ DisplayClass8.b _3 (IAsyncResult asyncResult) +42
System.Web.Mvc.Async। <> c_ DisplayClass4.b _3 (IAsyncResult ए आर) 15 System.Web.Mvc.MvcHandler.EndProcessRequest (IAsyncResult asyncResult) +51
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +606 सिस्टम.Web.Http आवेदन।ExecuteStep (IExecutionStep कदम है, बूलियन & completedSynchronously) +288

+1

जैसा कि आप जानते हैं, भले ही आप पर मिलान बदल कि डेटाबेस, परिवर्तन से पहले बनाए गए किसी भी ऑब्जेक्ट को टक्कर जारी रहेगी? यदि आपके पास 100 पंक्तियों वाली एक टेबल है। वे पुराने संयोजन को पकड़ेंगे जबकि नई प्रविष्टियों में नया संयोजन होगा। – twoleggedhorse

+0

इसके अलावा, जब आप डेटाबेस बनाते हैं और आप संयोजन को निर्दिष्ट नहीं करते हैं, तो यह सर्वर का संयोजन लेता है। क्या सर्वर फ्रेंच_CI_AI पर सेट है? – twoleggedhorse

+0

हम उस डेटाबेस के बीच संयोजन को बदलना चाहते हैं जब हम डेटाबेस बनाते हैं और समय ईएफ कोड पहले टेबल बनाते हैं लेकिन हम नहीं जानते कि तालिका खाली कैसे होनी चाहिए – VinnyG

उत्तर

6

का संभावित हल एक एसक्यूएल आदेश पर अमल करने डेटाबेस बनाने के लिए है, बजाय उपयोग _dbContext.Database.CreateIfNotExists हो सकता है();

_dbContext.Database.ExecuteSqlCommand ("

बनाएँ डाटाबेस [databasename] प्राथमिक पर (नाम = N'databasename ', FILENAME = N'c: \ PathToData \ databasename.mdf', आकार = 2048KB , FILEGROWTH = 1024KB) लॉग (नाम = N'databasename_log ', FILENAME = N'c: \ PathToLog \ databasename_log.ldf', आकार = 1024KB, FILEGROWTH = 10%) मुक़ाबला French_CI_AI

");

मैंने इसे पढ़ने में आसान बनाने के लिए थोड़ा अंतर रखा है, जाहिर है कि आप जिस नाम को चाहते हैं उसे डाटाबेसनाम बदल दें, और PathToData और PathToLog भी।

यदि आप सर्वर के संयोजन को फ्रेंच_CI_AI में बदलते हैं, तो सभी नए डेटाबेस इस संयोजन का उपयोग करके बनाए जाएंगे, लेकिन यह हमेशा सबसे अच्छा विकल्प नहीं है और यदि आप विकास चरण से पहले हैं तो सिरदर्द का कारण बनेंगे क्योंकि यह temp_db डेटाबेस को भी प्रभावित करता है (अस्थायी तालिकाओं और अन्य अस्थायी वस्तुओं)।

+0

आप एसएसएमएस में निम्न चरणों से स्क्रिप्ट उत्पन्न कर सकते हैं। डेटाबेस फ़ोल्डर -> नया डेटाबेस पर राइट क्लिक करें। सेटअप करें कि आप कैसे काम करते हैं और फिर शीर्ष पर स्क्रिप्ट आइकन पर क्लिक करें (ठीक बटन नहीं)। अपना एसक्यूएल उत्पन्न करने के लिए "नई क्वेरी विंडो पर स्क्रिप्ट एक्शन" विकल्प चुनें। मुख्य बनाने dabase कमांड के बाद आप अधिकांश सेटिंग्स को बहुत अधिक अनदेखा कर सकते हैं। – twoleggedhorse

+0

यदि आप इस कामकाज में uglies के बारे में चिंतित हैं तो आप आसानी से डेटाबेस नाम और डीबी फ़ाइल स्थान निर्धारित करने के लिए मौजूदा सम्मेलनों का पालन करने के लिए कोड का विस्तार कर सकते हैं।अन्यथा, आप स्थानीय बिल्डरों को अपने निर्माण में थोड़ा असामान्य करने की कोशिश कर रहे अन्य डेवलपर्स को खराब करने का जोखिम उठाते हैं (जैसे एक परियोजना पर परीक्षण के लिए कुछ अलग डीबी बनाए रखना)। –

+0

यह एक अच्छा समाधान है लेकिन मुझे पूरा यकीन नहीं है कि यह मेरी समस्या का समाधान है क्योंकि यह ईएफ का उपयोग नहीं किया जाता है। – 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

संबंधित मुद्दे