Problema di connessione al database: istanza dell'utente ed entità del framework
-
29-10-2019 - |
Domanda
Ho creato un file modello di entità (.edmx) basato su un file .mdf nella mia applicazione ASP.NET, inserito nella mia App_Data
Cartella.
Prima di tutto la mia stringa di connessione, creata dalla procedura guidata del framework entità:
<connectionStrings>
<add name="Sales_DBEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source=.\SQLEXPRESS;attachdbfilename="c:\users\ext\documents\visual studio 2010\Projects\WebProject_A\WebProject_A\App_Data\Sales_DB.mdf";integrated security=True;USER INSTANCE=TRUE;multipleactiveresultsets=True;App=EntityFramework'"
providerName="System.Data.EntityClient" />
</connectionStrings>
Quanto sopra è posto in un file app.config
File creato dalla procedura guidata.
Ho copiato la stessa stringa di connessione al web.config
File anche (non sono sicuro che questo sia necessario).
Ho riscontrato due problemi quando ho tentato di eseguire successivamente la stessa applicazione su una mia macchina (ho creato l'applicazione su una macchina diversa).
Il primo riguardava l'istanza dell'utente:
Impossibile generare un'istanza utente di SQL Server a causa di un errore nell'avvio del processo per l'istanza dell'utente. La connessione sarà chiusa
La prima cosa che non capisco davvero è ciò che definisce effettivamente un'istanza dell'utente.
Secondo MSDN:
Un'istanza utente è un'istanza separata del motore di database SQL Server Express generato da un'istanza principale
Il mio database locale è considerato un'istanza utente?
Vorrei davvero qualche chiarimento sulla questione perché mi sono imbattuto in post suggerendo di contrassegnarlo come falso, e il motivo non mi era chiaro.
Un altro post su questo argomento
Da lì mi sono imbattuto in un'altra soluzione che spiega che per questo problema è necessario abilitare l'istanza dell'utente nel server SQL sulla macchina.
Ho fatto ciò che è stato spiegato in quel post
Ma ora ho riscontrato un nuovo problema:
Un tentativo di allegare un database automatico per file (percorso completo al mio file app_data my.mdf) esiste un database con lo stesso nome o non è possibile aprire un file specificato o si trova su una condivisione UNC.
Ho già tentato di eliminare tutti i file sotto
C:\Documents and Settings\(your user account name)\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS
E riavvia come suggerito in altri post, ma ancora non riesco a trovare una soluzione chiara per questo problema.
So che questo è un post lungo ma qualsiasi aiuto sarebbe apprezzato
Grazie in anticipo.
Soluzione
Leggi questo Ottima panoramica di quali sono veramente le istanze dell'utente.
In poche parole:
SQL Server ti consente di avere più istanze di per sé su un singolo computer - è possibile accedere all'istanza predefinita utilizzando solo il nome della macchina (o l'indirizzo IP) del computer host - tutte le altre istanze devono essere specificate da un Nome dell'istanza (come il
SQLExpress
sulla tua macchina)Ai fini dello sviluppo, puoi anche creare un istanza dell'utente - Ogni utente ottiene la propria istanza separata di SQL Server (funziona in Edizione espressa solo) e un database è allegato dal suo nome file (
path\Sales_DB.mdf
) a quell'istanza dell'utente. Questa istanza viene avviata su richiesta, quindi corre e viene chiusa quando non è più necessario
Mentre questo funziona alla grande per lo sviluppo, non è davvero destinato a dopo, certamente non per uso di produzione.
In un ambiente di produzione, vuoi Allega i file di database Per l'istanza effettiva SQL Server, dovrebbero essere eseguiti, in genere utilizzando SQL Server Management Studio. Quando lo fai, non ti riferisci più a quel database tramite il suo nome del file, ma invece usi il nome del database Ciò è stato dato al database quando è stato allegato al server. In questo caso, SQL Server gestirà tutti i dettagli delle operazioni e che l'istanza SQL Server è sempre attiva e in esecuzione (non è necessario iniziare "su richiesta" tutto il tempo) e puoi usare cose come le autorizzazioni e Accedi per controllare l'accesso al database.
La tua stringa di connessione sembrerebbe quindi qualcosa del genere:
<connectionStrings>
<add name="Sales_DBEntities"
connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='server=YourServerNameHere;database=Sales_DB;integrated security=True;App=EntityFramework'"
providerName="System.Data.EntityClient" />
</connectionStrings>
Quando è stato allegato un database a un'istanza SQL Server di produzione (o test), non è necessario sapere quali sono i file che compongono il database e non è necessario specificare tali file: SQL Server si occuperà Quello. Ti riferisci semplicemente al database tramite il suo nome del database.
Altri suggerimenti
La soluzione è sempre più semplice di quanto previsto:
- fare doppio clic su
model.edmx
File -> Il designer si aprirà. - Fare clic con il tasto destro sul designer ->
Update model from database
. - Nuova connessione ->
Choose Database file (.mdf)
sotto tipo. - Sfoglia -> Vai al tuo
App_Data
cartella e scegli il db. - Copia la stringa di connessione creata in
App.config
aweb.config
.
Ciao.