EF5: Impossibile allegare il file "{0}" come database "{1}"


140

Riscontro il problema esatto come descritto qui (leggi la sezione "Impossibile allegare al file MDF eliminato"), ma la soluzione al problema non viene indicata qui ...

In breve, il problema è che dopo aver eliminato il .mdffile, viene generata la seguente eccezione quando provo ad accedere al DB usando EF 5.0.

DataException-> EntityException-> SqlException:
impossibile allegare il file '{0}' come database '{1}'

Ho eliminato il file DB e ora ricevo quel brutto messaggio di errore quando eseguo l'applicazione aspettandomi che utilizzi il suo inizializzatore. Un modo per risolvere questo problema?


1
Mi dispiace non aver fornito una risposta specifica, ma al momento non avevo una soluzione che funzionasse al 100% delle volte. Cerco ora di evitare l'errore non utilizzando i database collegati dall'utente. In genere, potrei correggere l'errore collegandomi a SQL Server Management Studio e scollegando il database nell'errore.
OdeToCode

Il problema è che il database non esiste più poiché ho già eliminato il file fisico. In realtà ho provato a occuparmene in uno degli studi (integrato in VS ed esterno). La mia risposta in realtà non è una soluzione ma piuttosto una soluzione alternativa, mi dice solo che non devi attenersi a LocalDb.
Shimmy Weitzhandler,

Dall'esperto EF Rowan Miller - vedi romiller.com/2013/05/17/… Speriamo di fornire soluzioni migliori nella prossima versione VS.
RickAndMSFT,

Un'utile guida alla risoluzione dei problemi: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell,

Risposte:


220

Se si elimina il file DB, rimane comunque registrato con SqlLocalDB. A volte lo corregge per eliminare il DB. Puoi farlo dalla riga di comando.

  1. Apri "Propmpt comando comandi per VisualStudio" nel menu Start / Programmi.
  2. Esegui i seguenti comandi:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
Non ho trovato Sql Server Object Explorer, immagino perché sto usando VS 2012 Express. Quindi, non posso provare la risposta accettata. Tuttavia, la tua risposta ha funzionato perfettamente per me. Grazie.
Newman,

3
La tua risposta mi ha appena salvato. Non avevo il nodo secondario (localdb) \ v11.0 dalla risposta accettata e non potevo rimuovere i riferimenti da SQL Management Studio, quindi evviva!
Santux,

18
Questo ha funzionato per me dopo aver eliminato i file. Puoi anche eseguire i comandi da Strumenti -> Libreria Gestione pacchetti -> Gestione pacchetti console.
Bart Verkoeijen,

11
Come nota v11.0a margine , è specifico di SQL LocalDB 2012. Se si utilizza LocalDB 2014, MS lo ha rinominato MSSqlLocalDbinvece.
CodingWithSpike

4
in relazione al commento sopra non puoi nemmeno inserire alcun nome db e si applicherà solo a quello predefinito, che ho usato di seguito con vs2015 e ha funzionato: sqllocaldb.exe stop sqllocaldb.exe delete
Deviney

147

Per chi è ancora alla ricerca di una soluzione ...

Vai su Esplora oggetti / SQL Server Explorer ed elimina il database dal nodo secondario (localdb) \ v11.0!
inserisci qui la descrizione dell'immagine

Esiste essenzialmente un database locale conservato dove dovrebbero essere i file e se si desidera eliminare i file del database assicurarsi di rimuoverli da questa utility di esplorazione, non manualmente.


questo mi ha morso una volta, la seconda volta che ho avuto migrazioni automatiche == false FML
workabyte

8
Inoltre, se non lo vedi. Aggiungi una nuova connessione e inserisci "(localdb) \ v11.0" (con Windows Auth). Può sembrare semplice, ma stavo fissando il mio schermo per un po 'lì. :)
Peter,

@Peter Ok, ho aggiunto il database e ora vedo i miei 2 contesti. Quando elimino da questa vista, ricevo un nuovo errore: "impossibile recuperare il livello di accesso ai dati per questo database". Sono stato in grado di aggirare questo utilizzando il prompt dei comandi.
nVentimiglia,

1
Quando si utilizza la factory di connessione predefinita di EF6, è possibile che si stia utilizzando mssqllocaldb. Cambia il server in (LocalDb) \ mssqllocaldb e verifica se si connette. Esistono diverse versioni di LocalDb e una non mostra tutto.
Jim Yarbro,

Inoltre, ciò che ho sperimentato: fai clic su disconnetti e quindi riconnetti se non vedi più il tuo database. (L'aggiornamento non aiuta)
StefanG

19

Ho provato prima la soluzione di JSobell ma non ho visto il mio database elencato lì. Ho eseguito i comandi di CodingWithSpike dal prompt dei comandi di VS Developer, ma neanche quello ha funzionato. Alla fine ho eseguito gli stessi comandi di CodingWithSpike dalla console di Package Manager e ha funzionato.

    PM> sqllocaldb.exe stop v11.0
    LocalDB instance "v11.0" stopped.

    PM> 
    PM> sqllocaldb.exe delete v11.0
    LocalDB instance "v11.0" deleted.

    PM> sqllocaldb.exe start v11.0
    LocalDB instance "v11.0" started.

9

Tutto a posto.

La mia soluzione era semplice, ho cambiato per utilizzare il server locale:

Ho modificato l' DataSourceattributo nella stringa di connessione da:

Data Source=(LocalDb)\v11.0;blah

Per:

Data Source=.\SQLEXPRESS;blah

Un'altra soluzione è accedere a LocalDb tramite SQL Management Studio e provare a eliminare quel database:

inserisci qui la descrizione dell'immagine

Tuttavia non ha funzionato per me, quando provo a eliminarlo, dice "TITLE: Microsoft SQL Server Management Studio

Il database '{0}' non esiste sul server. (SqlManagerUI)

Quando provo a staccarlo, il database non appare nell'elenco per staccare la selezione, "Porta offline" mi porta anche all'errore sopra.

Il che mi porta a pensare che questo sia un solido bug in LocalDB.


Ho dei problemi nel tentativo di utilizzare DB locale con EF5
Nikos,

LocalDB ha il vantaggio di poterlo eseguire con l'account locale senza la necessità di privilegi di amministratore, proprio come IIS Express. Ciò consente di condividere progetti con molti sviluppatori senza configurare IIS o SQL Server per ogni singolo utente.
Bart Verkoeijen,


2

La risposta migliore e facile l'ho appena risolta ora, basta usare il nome del tuo server sql come origine dati, il catalogo iniziale è il nome del tuo database e vai a rimuovere la riga mdf


1

Nel mio caso utilizzo le migrazioni e in config ho semplicemente cambiato il nome di dataContext e la stessa classe dataContext (basta rinominare), quindi riprovare e questo mi ha aiutato


1

Per SQL 2014, seguire la risposta selezionata CodingWithSpike e questo commento

Come nota a margine, la v11.0 è specifica per SQL LocalDB 2012. Se si utilizza LocalDB 2014, invece MS lo ha rinominato in MSSqlLocalDb . - CodingWithSpike 29 agosto 14 alle 19:20


Nota a margine utile, ho riscontrato questo lavoro su un vecchio progetto con VS 2015 Ulteriori informazioni . Ci sono anche cambiamenti simili in VS 2013 da v11.0a ProjectsV12 . Almeno sulla mia macchina :-).
mira il

0

Ho avuto lo stesso problema e l'ho risolto impostando manualmente la cartella "DataDirectory" su un'altra cartella nei file binari della mia app.

Ho inserito questa riga nel metodo Global.asax Application_Start:

AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

La mia stringa di connessione è attualmente impostata su questo:

<connectionStrings>
    <add name="DataContext" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DataContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DataContext.mdf"
  providerName="System.Data.SqlClient" />


Non l'ho provato, ma probabilmente non dovrebbe funzionare. perché DataDirectoryè già impostato sul locale App_Dataper impostazione predefinita, quindi a meno che non sia stato esplicitamente modificato prima, il codice non fa nulla.
Shimmy Weitzhandler

Se segui questo approccio, non modificare la directory, cambiare il nome del file MDF. Inoltre, vedi romiller.com/2013/05/17/…
RickAndMSFT,

0

Potrei risolverlo rinominando il nome DataBase nella mia stringa di connessione, dall'aspnet predefinito {{numbers} a un nome semplice, ha funzionato.


0

Connettersi a (LocalDb) \ v11.0 utilizzando Sql Server Management Studio, eliminare il db e quindi eseguire un database di aggiornamento nella console di gestione dei pacchetti.


0

Ho avuto lo stesso problema. Ho eseguito i seguenti comandi nella console di gestione dei pacchetti e il problema è stato risolto

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.