EF5: Die Datei '{0}' kann nicht als Datenbank '{1}' angehängt werden.

140

Ich habe das genaue Problem wie hier beschrieben (siehe Abschnitt "Kann nicht an gelöschte MDF-Datei angehängt werden"), aber die Lösung des Problems wird dort nicht angegeben ...

Kurz gesagt, das Problem ist, dass nach dem Löschen der .mdfDatei die folgende Ausnahme ausgelöst wird, wenn ich versuche, mit EF 5.0 auf die Datenbank zuzugreifen.

DataException-> EntityException-> SqlException: Die Datei '{0}' kann nicht als Datenbank '{1}' angehängt werden.

Ich habe die DB-Datei gelöscht und jetzt erhalte ich diese böse Fehlermeldung, wenn ich die Anwendung ausführe und erwarte, dass sie den Initialisierer verwendet. Wie kann man das beheben?

Shimmy Weitzhandler
quelle
1
Entschuldigung, ich habe keine spezifische Antwort gegeben, aber zu der Zeit hatte ich keine Lösung, die 100% der Zeit funktioniert. Ich versuche jetzt, den Fehler zu vermeiden, indem ich keine vom Benutzer angehängten Datenbanken verwende. Ich könnte den Fehler im Allgemeinen beheben, indem ich eine Verbindung mit SQL Server Management Studio herstelle und die Datenbank im Fehler trenne.
OdeToCode
Das Problem ist, dass die Datenbank nicht mehr existiert, da ich die physische Datei bereits gelöscht habe. Ich habe tatsächlich versucht, mich in einem der Studios (integriert in VS und extern) darum zu kümmern. Meine Antwort ist wirklich keine Lösung, sondern eine Problemumgehung. Sie sagt nur, dass Sie sich nicht an LocalDb halten müssen.
Shimmy Weitzhandler
Vom EF-Experten Rowan Miller - siehe romiller.com/2013/05/17/… Wir hoffen, in der nächsten VS-Version bessere Lösungen anbieten zu können.
RickAndMSFT
Eine nützliche Anleitung zur Fehlerbehebung: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

Antworten:

220

Wenn Sie die DB-Datei löschen, bleibt sie weiterhin bei SqlLocalDB registriert. Manchmal wird das Problem behoben, um die Datenbank zu löschen. Sie können dies über die Befehlszeile tun.

  1. Öffnen Sie das "Developer Command Propmpt for VisualStudio" unter Ihrem Start- / Programmmenü.
  2. Führen Sie die folgenden Befehle aus:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

CodingWithSpike
quelle
1
Ich habe Sql Server Object Explorer nicht gefunden, weil ich VS 2012 Express verwende. Daher kann ich die akzeptierte Antwort nicht ausprobieren. Ihre Antwort hat jedoch perfekt für mich funktioniert. Vielen Dank.
Newman
3
Ihre Antwort hat mich gerade gerettet. Ich hatte nicht den Unterknoten (localdb) \ v11.0 aus der akzeptierten Antwort und konnte die Referenzen nicht aus dem SQL Management Studio entfernen, also Hurra für Sie!
Santux
18
Dies funktionierte bei mir nach dem Löschen der Dateien. Sie können die Befehle auch über Extras -> Bibliothekspaket-Manager -> Paketmanager-Konsole ausführen.
Bart Verkoeijen
11
v11.0Nebenbei bemerkt, das ist spezifisch für SQL LocalDB 2012. Wenn Sie LocalDB 2014 verwenden, hat MS es MSSqlLocalDbstattdessen in MSD umbenannt .
CodingWithSpike
4
In Bezug auf den obigen Kommentar können Sie auch keinen Datenbanknamen eingeben und er gilt nur für Ihren Standardnamen. Ich habe ihn unten mit vs2015 verwendet und es hat funktioniert: sqllocaldb.exe stop sqllocaldb.exe delete
Deviney
147

Für diejenigen, die noch nach einer Lösung suchen ...

Gehen Sie zu View / SQL Server Object Explorer und löschen Sie die Datenbank aus dem Unterknoten (localdb) \ v11.0!
Geben Sie hier die Bildbeschreibung ein

Im Wesentlichen wird eine lokale Datenbank gespeichert, in der angegeben ist, wo sich die Dateien befinden sollen. Wenn Sie die Datenbankdateien löschen möchten, müssen Sie sie nicht manuell aus diesem Explorer-Dienstprogramm entfernen.

JSobell
quelle
Dies hat mich einmal
gebissen
8
Auch wenn Sie es nicht sehen. Fügen Sie einfach eine neue Verbindung hinzu und geben Sie "(localdb) \ v11.0" (mit Windows Auth) ein. Es mag einfach erscheinen, aber ich starrte dort eine Weile auf meinen Bildschirm. :)
Peter
@ Peter Ok, Datenbank hinzugefügt und jetzt sehe ich meine 2 Kontexte. Wenn ich aus dieser Ansicht lösche, wird eine neue Fehlermeldung angezeigt: "Datenzugriffsebene für diese Datenbank kann nicht abgerufen werden". Ich konnte dies mithilfe der Eingabeaufforderung umgehen.
NVentimiglia
1
Wenn Sie die Standardverbindungsfactory von EF6 verwenden, verwenden Sie möglicherweise stattdessen mssqllocaldb. Ändern Sie den Server in (LocalDb) \ mssqllocaldb und prüfen Sie, ob eine Verbindung besteht. Es gibt mehrere Versionen von LocalDb, und eine zeigt Ihnen nicht alle.
Jim Yarbro
Außerdem habe ich Folgendes erlebt: Klicken Sie auf Trennen und stellen Sie dann erneut eine Verbindung her, wenn Sie Ihre Datenbank nicht mehr sehen. (Aktualisieren hilft nicht)
StefanG
19

Ich habe zuerst die Lösung von JSobell ausprobiert, aber meine Datenbank dort nicht aufgelistet. Ich habe die Befehle von CodingWithSpike über die VS Developer-Eingabeaufforderung ausgeführt, aber das hat auch nicht funktioniert. Schließlich habe ich die gleichen Befehle von CodingWithSpike über die Package Manager-Konsole ausgeführt, und das hat funktioniert.

    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.
AJs
quelle
9

In Ordung.

Meine Lösung war einfach, ich habe den lokalen Server verwendet:

Ich habe das DataSourceAttribut in der Verbindungszeichenfolge geändert von:

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

Zu:

Data Source=.\SQLEXPRESS;blah

Eine andere Lösung besteht darin, sich über SQL Management Studio bei LocalDb anzumelden und zu versuchen, diese Datenbank zu löschen:

Geben Sie hier die Bildbeschreibung ein

Bei mir hat es jedoch nicht funktioniert. Wenn ich versuche, es zu löschen, wird "TITEL: Microsoft SQL Server Management Studio" angezeigt

Die Datenbank '{0}' ist auf dem Server nicht vorhanden. (SqlManagerUI)

Wenn ich versuche, es zu trennen, wird die Datenbank nicht in der Liste zur Auswahl der Trennung angezeigt. "Offline schalten" führt mich auch zu dem obigen Fehler.

Was mich zu der Annahme führt, dass dies ein solider Fehler in LocalDB ist.

Shimmy Weitzhandler
quelle
Ich habe Probleme beim Versuch, die lokale Datenbank mit EF5 zu verwenden
Nikos
LocalDB hat den Vorteil, dass Sie es unter Ihrem lokalen Konto ausführen können, ohne dass Administratorrechte erforderlich sind, genau wie bei IIS Express. Auf diese Weise können Projekte für viele Entwickler freigegeben werden, ohne dass für jeden einzelnen Benutzer IIS oder SQL Server eingerichtet werden muss.
Bart Verkoeijen
4

Die einfachste Lösung besteht darin, einfach den Namen Ihrer Datenbank in der Verbindungszeichenfolge zu ändern. Weitere Lösungen finden Sie im Rowan Millers-Blog zum Löschen einer Datenbank aus Visual Studio 2012 . Wir hoffen, dieses Problem in einer zukünftigen Ausgabe beheben zu können.

RickAndMSFT
quelle
2

Die beste und einfachste Antwort, die ich gerade gelöst habe. Verwenden Sie einfach Ihren SQL-Servernamen als Datenquelle. Der erste Katalog ist Ihr Datenbankname. Dann entfernen Sie die MDF-Zeile

begabtes
quelle
1

In meinem Fall verwende ich Migrationen und in der Konfiguration habe ich einfach den Namen von dataContext und die dataContext-Klasse selbst geändert (nur umbenennen), dann erneut versucht und das hat geholfen

no0bassss
quelle
1

Für SQL 2014 folgen Sie bitte der von CodingWithSpike ausgewählten Antwort und diesem Kommentar

Nebenbei bemerkt, v11.0 ist spezifisch für SQL LocalDB 2012. Wenn Sie LocalDB 2014 verwenden, hat MS es stattdessen in MSSqlLocalDb umbenannt . - CodingWithSpike 29. August 14 um 19:20 Uhr

Der Eine
quelle
Hilfreiche Randnotiz, ich stoße auf diese Arbeit an einem alten Projekt mit VS 2015 Weitere Informationen . Es gibt auch ähnliche Änderungen in VS 2013 von v11.0bis ProjectsV12 . Zumindest auf meiner Maschine :-).
Ziel
0

Ich hatte das gleiche Problem und löste es, indem ich den Ordner "DataDirectory" manuell auf einen anderen Ordner in meinen App-Binärdateien legte.

Ich habe diese Zeile in die Global.asax Application_Start-Methode eingefügt:

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

Meine Verbindungszeichenfolge ist derzeit auf Folgendes eingestellt:

<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" />

Filipe Scur
quelle
Ich habe es nicht getestet, aber das sollte wahrscheinlich nicht funktionieren. Da DataDirectorydie App_DataStandardeinstellung bereits auf "Lokal" gesetzt ist, führt Ihr Code nichts aus, sofern dies nicht zuvor explizit geändert wurde.
Shimmy Weitzhandler
Wenn Sie diesen Ansatz wählen, ändern Sie nicht das Verzeichnis, sondern den MDF-Dateinamen. Siehe auch romiller.com/2013/05/17/…
RickAndMSFT
0

Ich konnte das Problem beheben, indem ich den Datenbanknamen in meiner Verbindungszeichenfolge umbenannte. Von der Standard-Aspnet- {-Nummer} in einen einfachen Namen funktionierte es.

Edgar Salazar
quelle
0

Stellen Sie mit SQL Server Management Studio eine Verbindung zu (LocalDb) \ v11.0 her, löschen Sie die Datenbank und führen Sie dann eine Update-Datenbank in der Paketmanager-Konsole durch.

Nidhin
quelle
0

Ich hatte das gleiche Problem. Ich habe die folgenden Befehle in der Paketmanager-Konsole ausgeführt und das Problem behoben

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Tony Newsom
quelle