2012-11-17 6 views
8

voglio cambiare regole di confronto di tutto il database creato dal codice ef prima, provo a farlo eseguendo uno script dopo la creazione, ma non opere,Come cambiare/collazione impostato nel Codice EF primo

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

È possibile impostare le regole di confronto prima di creare il database?

Questo è l'eccezione che ottengo:

Ripristino i risultati di connessione in uno stato diverso da quello iniziale login. L'accesso non riesce. Accesso fallito per utente 'afi'. Si è verificato un errore grave nel comando corrente. I risultati, se presenti, dovrebbero essere scartati .

[SqlException (0x80131904): il ripristino dei risultati della connessione in uno stato diverso dal login iniziale. L'accesso non riesce.

Accesso non riuscito per l'utente 'afi'. Si è verificato un grave errore nel comando corrente . I risultati, se del caso, deve essere eliminata.]
(eccezione SqlException, breakConnection booleano, Action`1 wrapCloseInAction) System.Data.SqlClient.SqlConnection.OnError 388
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, booleano callerHasConnectionLock, booleano asyncClose) 688
System.Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader datastream, bulkCopyHandler BulkCopySimpleResultSet, TdsParserStateObject stateObj, booleano & dataReady) 4403
sistema .Data.SqlClient.TdsParser.Run (Ru nBehavior RunBehavior, SqlCommand cmdHandler, SqlDataReader datastream, bulkCopyHandler BulkCopySimpleResultSet, TdsParserStateObject stateObj) +84
System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest (Byte [] tampone, richiesta TransactionManagerRequestType, String transactionName, TransactionManagerIsolationLevel isolivello, timeout Int32 , transazione SqlInternalTransaction, stateObj TdsParserStateObject, booleano isDelegateControlRequest) 1370
System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon (transactionRequest transactionRequest, String transactionName, IsolationLevel iso, 012.351.SqlInternalTransaction internalTransaction, booleano 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: si è verificato un errore durante l'avvio di una transazione su la connessione del provider. Vedere l'eccezione interna per i dettagli.]
System.Data.EntityClient.EntityConnection.BeginDbTransaction (IsolationLevel isolationLevel) 4.298.876
System.Data.EntityClient.EntityConnection.BeginTransaction() +10
System.Data.Objects.ObjectContext.SaveChanges (opzioni) 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() in c: \ inetpub \ wwwroot \ afi \ src \ Domain \ Storage \ EntitySession.cs: 54
Afi.Web.Controllers.CIController.Seed (Boolean excludeSomeData) in c: \ inetpub \ wwwroot \ afi \ src \ Web \ Controller \ CIControll er.cs: 263
Afi.Web.Controllers.CIController.Index() in c: \ inetpub \ wwwroot \ AFI \ src \ Web \ Controller \ CIController.cs: 89
lambda_method (Chiusura, ControllerBase, oggetto [ ]) +81
System.Web.Mvc.ReflectedActionDescriptor.Execute (controllerContext controllerContext, IDictionary parametri) +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 (passo IExecutionStep, booleano & completedSynchronously) +288

+1

Sei consapevole che anche se si cambia la fascicolazione sul database, tutti gli oggetti che sono stati creati prima della modifica manterranno le regole di confronto? Se hai una tabella con 100 righe in essa. Loro terranno le vecchie regole di confronto mentre le nuove voci avranno le nuove regole di confronto. – twoleggedhorse

+0

Inoltre, quando si crea un database e non si specificano le regole di confronto, vengono prese le regole di confronto del server. Il server è impostato su French_CI_AI? – twoleggedhorse

+0

vogliamo modificare le regole di confronto tra il momento in cui creiamo il database e il codice EF del tempo. Innanzitutto create le tabelle ma non sappiamo in che modo la tabella dovrebbe essere vuota. – VinnyG

risposta

6

Una soluzione potrebbe essere quella di eseguire un comando SQL per creare il database, piuttosto che usare _dbContext.Database.CreateIfNotExists();

_dbContext.Database.ExecuteSqlCommand ("

CREATE DATABASE [databasename] ON PRIMARIA (NAME = N'databasename ' FILENAME = N'C: \ PathToData \ databasename.mdf', SIZE = 2048 KB , FILEGROWTH = 1024KB) LOG ON (NAME = N'databasename_log 'FILENAME = N'C: \ PathToLog \ databasename_log.ldf', SIZE = 1024KB, FILEGROWTH = 10%) COLLATE French_CI_AI

");

Ho messo un po 'di spaziatura per rendere più facile la lettura, ovviamente cambia il nome del database con il nome che vuoi, e anche PathToData e PathToLog.

Se si modificano le regole di confronto del server su French_CI_AI, tutti i nuovi database verranno creati utilizzando questo confronto, ma non è sempre la scelta migliore e causerà mal di testa se si è passati allo stadio di sviluppo poiché influenza anche il database temp_db (tabelle temporanee e altri oggetti temporanei).

+0

È possibile generare lo script con i seguenti passaggi in ssms. Fare clic con il tasto destro sulla cartella dei database -> nuovo database. Imposta come desideri e poi fai clic sull'icona dello script in alto (non sul pulsante OK). Scegli l'opzione "Azione script su nuova finestra di query" per generare il tuo sql. Puoi praticamente ignorare la maggior parte delle impostazioni dopo il comando di creazione principale di base. – twoleggedhorse

+0

Se sei preoccupato per i brutti in questa soluzione alternativa, potresti facilmente espandere il codice per seguire le convenzioni esistenti per determinare il nome del database e il percorso del file db.Altrimenti, rischi di rovinare altri sviluppatori che cercano di ottenere una build locale o di provare a fare qualcosa di leggermente insolito nella loro compilazione (come mantenere alcuni DB diversi da testare su un singolo progetto). –

+0

È una buona soluzione, ma non sono abbastanza sicuro se è la soluzione al mio problema poiché non è stato fatto usando EF. – VinnyG

0

solo aggiungere [] per database dei nomi,

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

per C# SqlConnection.ClearAllPools(); prima che la prossima connessione sia iniziata funziona pure.

0

Se si desidera modificare regole di confronto del database corrente, è possibile utilizzare questo frammento

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

o

_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