Die Datei * .mdf kann nicht als Datenbank angehängt werden

74

Grundsätzlich habe ich ein Tutorial befolgt und beschlossen, die .mdfDatei danach zu löschen .

Wenn ich jetzt versuche, die Anwendung auszuführen, wird der folgende Fehler angezeigt (der Titel dieses Threads). Der Code, bei dem ich den Fehler erhalte, wird unten angezeigt (ASP.NET MVC 4):

OdeToFoodDB db = new OdeToFoodDB();

public ActionResult Index()
{
    var model = db.Restaurants.ToList();
    return View(model);
}

Meine Verbindungszeichenfolge lautet wie folgt:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=OdeToFoodDb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

Ich habe versucht, den SQL Server-Objekt-Explorer zu betrachten, aber er sieht folgendermaßen aus:

Außerdem werden im Server-Explorer keine Datenverbindungen angezeigt.

Und wenn ich versuche, eine neue Verbindung im Server-Explorer hinzuzufügen, werden keine Datenbanken mit Namen angezeigt OdeToFoodDb.

Entschuldigen Sie diese umfassende Frage, aber ich bin neu in Entity Framework und verstehe nicht ganz, was hier falsch ist.

John Mayer
quelle
4
Sie sagen, dass Sie die MDF-Datei gelöscht haben. Das ist die SQL Server-Datenbankdatei. Wenn Sie es gelöscht haben, gibt es keine Datenbank, daher der Fehler.
STLDev
Wollte dasselbe sagen wie @STLDeveloper, wie kann der Code fortgesetzt werden, wenn er nicht die erforderliche Datenbank findet ...
Owais Qureshi
Befindet sich nach dem Kompilieren eine OdeToFooDb.mdf im Ordner bin \ Debug \ App_Data Ihres MVC-Projekts?
Ren
2
@rene Nein Es gibt überhaupt keine MDF-Dateien. Wie generiere ich eine MDF-Datei?
John Mayer
1
@rene Es gibt überhaupt keine MDF-Datei. Ich habe versucht, die dbcontext-Klasse umzubenennen, und jetzt funktioniert es. Was könnte das Problem verursacht haben?
John Mayer

Antworten:

59

Sehen Sie sich Folgendes an: Entity Framework erstellt keine Datenbank

Ich würde versuchen, der Datenbank einen anderen Namen zu geben. Manchmal können Probleme mit SQL Express auftreten, wenn Sie ein zweites Mal versuchen, eine Datenbank mit demselben Namen zu erstellen. Es gibt eine Möglichkeit, dies mit SQL Server Management Studio zu beheben, aber es ist im Allgemeinen einfacher, nur einen anderen Datenbanknamen zu verwenden.

Bearbeiten Diese Antwort wurde akzeptiert, da sie den Fehler und die von OP verwendete Problemumgehung bestätigt (das Umbenennen der Datenbank könnte helfen ). Ich stimme voll und ganz zu, dass das Umbenennen der Datenbank nicht wirklich akzeptabel ist und das Problem nicht vollständig löst . Leider habe ich die anderen Möglichkeiten zur Lösung in SSMS nicht überprüft.

Chris
quelle
3
Ich würde dieses Update gerne mit SSMS kennenlernen, da ich das gleiche Problem habe und den Datenbanknamen intakt halten möchte.
Julealgon
Ja bitte @Chris, wie können Sie dieses Problem mit SSMS beheben?
Ian Campbell
@ Julealgon dieser Prozess hier
Bogac
3
Sie müssen dies nicht tun, sondern nur die Datenbank aus der Visual Studio SQL Server-Objekt-Explorer-Ansicht löschen (und Verbindungen schließen)
Sebastián Rojas
Ich denke nicht, dass dies ein guter Weg und für Produktionssysteme absolut unbrauchbar ist.
Xan-Kun Clark-Davis
124

Ich denke, dass Sie für SQL Server Local Db die Initial CatalogEigenschaft nicht verwenden sollten . Ich schlage vor zu verwenden:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

Ich denke, dass die lokale Datenbank nicht mehrere Datenbanken in derselben MDF-Datei unterstützt. Geben Sie daher an, dass ein anfänglicher Katalog nicht unterstützt wird (oder nicht gut unterstützt wird und ich einige seltsame Fehler habe).

Davide Icardi
quelle
18
Durch Entfernen des Teils "Erstkatalog" aus der Verbindungszeichenfolge wurde dieses Problem für mich behoben.
Tim Friesen
2
Alle anderen Vorschläge waren völlig übertrieben. Das war einfach, knapp und funktionierte.
Jammer
Dies hat nichts mit dem eigentlichen Problem zu tun. Natürlich können Sie einen Katalognamen angeben.
Xan-Kun Clark-Davis
8
Dies ist die eigentliche Antwort auf das Problem oder eine bessere Problemumgehung, zumindest für diesen Fehler. Die offizielle Antwort auf diese Frage ist falsch.
Nathan McKaskle
2
Mit anderen Worten, für localdb müssen Sie "initial catalog = ..." durch "AttachDBFilename = ..." ersetzen, da sonst beim Versuch, eine Verbindung herzustellen, zufällige SqlExceptions auftreten.
Seguso
35
  1. Führen Sie in der Package Manager-Konsole Folgendes aus:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. Führen Sie Ihr Projekt aus

  3. Registrieren Sie einen Benutzer
Maske
quelle
Anstatt v11.0in MSSQLLocalDBdie data source=(LocalDb)\MSSQLLocalDB;...
Webkonfiguration
16

Entfernen Sie diese Zeile aus der Verbindungszeichenfolge, die dies tun soll;) "AttachDbFilename = | DataDirectory | Whateverurdatabasenameis-xxxxxxxxxx.mdf"

Ahmad Moussa
quelle
Hat auch für mich gearbeitet. Dies sollte wahrscheinlich die Antwort sein.
Matt West
10
Warten . Was? Entweder möchten Sie eine Datenbankdatei angeben, dann benötigen Sie diese Zeile unbedingt oder Sie tun dies nicht. Dann müssen Sie diese Zeile unbedingt weglassen. Dies behebt in keiner Weise das zugrunde liegende Problem.
Xan-Kun Clark-Davis
6

"Die Datei 'C: \ Github \ TestService \ TestService \ App_data \ TestService.mdf kann nicht als Datenbank' TestService 'angehängt werden.

Wenn die obige Fehlermeldung angezeigt wird, führen Sie die folgenden Schritte aus.

  1. Öffnen Sie den SQL Server-Objekt-Explorer
  2. Klicken Sie auf die Schaltfläche Aktualisieren.
  3. Erweitern Sie (localdb) \ MSSQLLocalDB (SQL Server 12.x.xxxxx - xxxxx \ xxxx)
  4. Datenbank erweitern
  5. Bitte entfernen Sie die vorhandene Datenbank mit demselben Namen
  6. Klicken Sie auf die rechte Schaltfläche und löschen Sie dann
  7. Kehren Sie zu Ihrer Paketverwaltungskonsole zurück
  8. Datenbank auf den neusten Stand bringen
YTKim
quelle
5

Ich habe das gleiche Problem konfrontiert. Die folgenden Schritte in VS 2013 haben das Problem für mich gelöst:

  1. Fügen Sie im Server-Explorer eine neue Verbindung zur Datenbank hinzu
  2. Wählen Sie Microsoft SQL Server-Datenbankdatei als Datenquelle aus
  3. Wählen Sie den Dateinamen der Datenbank so aus, wie er gemäß der Verbindungszeichenfolge in Ihrer web.config sein soll
  4. Es wurde eine neue Datenbankdatei erstellt und im Datenbank-Explorer wurden zwei Datenbankverbindungen angezeigt: "MyDatabaseName" und "MyDatabaseName (MyProjectName)".
  5. Eine Verbindung löschen (Ich habe "MyDatabaseName" gelöscht)
CI Apps
quelle
:-) Es hört sich für mich so an, als hätten Sie die MDF-Datei einmal über den Explorer und nicht mit der Database.Delete () gelöscht . Befehl.
Xan-Kun Clark-Davis
3

So beheben Sie dies mit SQL SERVER Management Studio

Ihr Problem: Sie erhalten eine Fehlermeldung wie "Die Datei" YourDB.mdf "kann nicht als Datenbank" YourConnStringNamedContext "angehängt werden.

Grund: tritt auf , weil Sie die Sicherungsdateien .mdf, ldf gelöscht haben, ohne die Datenbank in der laufenden Instanz von SqlLocalDb tatsächlich zu löschen. Das erneute Ausführen des Codes in VS hilft nicht, da Sie keine Datenbank mit demselben Namen neu erstellen können (und deshalb funktioniert das Umbenennen, lässt aber den alten Phantom-Datenbanknamen herumliegen).

Das Update : Ich verwende VS2012 und übernehme es ähnlich für eine andere Version.

Navigieren Sie zum unteren Pfad und geben Sie ein

c: \ Programme \ Microsoft SQL Server \ 110 \ Tools \ Binn> sqllocaldb info

Über cmd werden die Instanznamen angezeigt, einschließlich 'v11.0'.

Wenn die Instanz bereits ausgeführt wird, geben Sie an der Eingabeaufforderung ein

sqllocaldb info v11.0

Beachten Sie die folgende Info Besitzer: YourPCName \ Benutzername, Zustand: Laufen, Instance Pipenamen: np:. \ \ Pipe \ LocalDB # 12345678 \ Tsql \ query, wo 123456789 ist eine zufällige alphanumerische

Wenn State nicht ausgeführt oder gestoppt wird, starten Sie die Instanz mit

sqllocaldb start v11.0

und extrahieren Sie die gleichen Informationen wie oben.

Geben Sie im Dialogfeld "Verbinden" von SS Management Studio Folgendes ein

Servername: np: \. \ pipe \ LOCALDB # 12345678 \ tsql \ query

auth: Windows auth

Benutzername: (Wie Besitzer, ist es für Win. auth. ausgegraut.)

Suchen Sie nach dem Verbinden die Phantom-Datenbank, die Sie gelöscht haben (z. B. YourDB.mdf sollte eine Datenbank mit dem Namen YourDB erstellt haben), und löschen Sie sie wirklich.

Erledigt! Sobald es weg ist, sollte VS EF kein Problem damit haben, es neu zu erstellen.

joedotnot
quelle
2

Sie haben bereits eine alte Kopie dieser Datenbank im Server Explorer installiert. Es handelt sich also um eine einfache Namenskollision im Server Object Explorer / SQL Server. Sie haben wahrscheinlich denselben Datenbankkatalognamen bereits erstellt, bevor Sie ihn in den Ordner Apps_Data verschoben haben. Damit der Datenbankname bereits existiert und nur gelöscht werden muss.

Gehen Sie einfach zu Visual Studio> Ansicht> SQL Server-Objekt-Explorer und löschen Sie den alten Datenbanknamen und seine Verbindung. Wiederholen Sie Ihre App erneut und sie sollte die MDF-Datei in App_Data installieren und dieselbe exakte Datenbank im Server-Explorer erneut erstellen.

Stokely
quelle
1
Dies ist die richtige Antwort, da sie tatsächlich das Kernproblem angeht. Die andere Antwort bietet nur die Problemumgehung.
Nick Fleetwood
Das ist richtig, dies und die Antwort von @YTKim - bei allen anderen Antworten bleibt die alte Datenbankreferenz in der LocalDB-Konfiguration erhalten und wird das gleiche Problem nicht zweimal beheben.
Samuel Jaeschke
1

Entfernen Sie gemäß @ davide-icardi den "Initial Catalog = xxx;" Suchen Sie in web.config nach Ihrer Azure-Veröffentlichungsprofildatei, um sie auch hier zu entfernen:
[YourAspNetProject-Pfad] \ Properties \ PublishProfiles [YourAspNetProjectName] .pubxml

<PublishDatabaseSettings>
  <Objects xmlns="">
    <ObjectGroup Name="YourAspNetProjectName" Order="1" Enabled="True">
      <Destination Path="Data Source=AzureDataBaseServer;Initial Catalog=azureDatabase_db;User ID=AzureUser_db_sa@AzureDataBaseServer;Password=test" />
      <Object Type="DbCodeFirst">
        <Source Path="DBMigration" DbContext="YourAspNetProjectName.Models.ApplicationDbContext, YourAspNetProjectName" MigrationConfiguration="YourAspNetProjectName.Migrations.Configuration, YourAspNetProjectName" Origin="Configuration" />
      </Object>
    </ObjectGroup>
  </Objects>
</PublishDatabaseSettings>
OzBob
quelle
1

Ich habe festgestellt, dass das Problem durch Auskommentieren des Kontextabschnitts behoben wurde, der zum Initialisieren der Datenbank verwendet wurde. Havnt hatte noch Zeit herauszufinden, was mit den Seeding-Anweisungen nicht stimmte, aber das Entfernen des Seeding löste das Problem.

Steven
quelle
1

Bin auf dieses Problem gestoßen. In meinem Fall durch Löschen der .mdf verursacht, während iispexress noch lief und daher noch die DB verwendet. Klicken Sie mit der rechten Maustaste auf iisexpress in der Taskleiste und klicken Sie auf Beenden. DANN löschen Sie die MDF, um zu verhindern, dass dieser Fehler tatsächlich auftritt.

Um diesen Fehler zu beheben, klicken Sie einfach in VS mit der rechten Maustaste auf den Ordner App-Data. Fügen Sie ein neues Element hinzu> SQL Server-Datenbank. Name: [Verwenden Sie den vom Update-Datenbankfehler angegebenen Datenbanknamen] Klicken Sie auf Hinzufügen.

Rick Drayson
quelle
1

Ändern Sie einfach den Datenbanknamen aus der Datei auf Projektebene web.config und aktualisieren Sie die Datenbank.

connectionString = Data Source = (LocalDb) \ MSSQLLocalDB; AttachDbFilename = "| DataDirectory | \ aspnet-Projektname-2018041307050 6 .mdf"; Initial Catalog = "aspnet - 2018041307050 6 "; Integriert

Ändern Sie die fette Ziffer in eine andere Zahl:

connectionString = Datenquelle == (LocalDb) \ MSSQLLocalDB; AttachDbFilename = "| DataDirectory | \ aspnet-Projektname-2018041307050 7 .mdf"; Initial Catalog = "aspnet - 2018041307050 7 "; Integriert

Lösungsgeist
quelle
1

Ich habe nicht alle Antworten gelesen, aber wenn Ihre .mdfDatei NICHT Teil des SQL-Installationspfads ist C:\Temp, haben die SQL Database Engine-Dienstkonten keine Berechtigung zum Erstellen und Schreiben in die .ldfDatei oder sogar zum Lesen der .mdfDatei .

Die Lösung besteht darin, dass Sie dem SQL Server-Datenbankmodul-Dienstkonto, auf dem der SQL-Instanzdienst ausgeführt wird, Dateisystemberechtigungen erteilen müssen. Daher habe ich meinem C:\TempPfad, der meine .mdfDatei für die Konten NT Service\MSSQL$SQLEXPRESS01und die NT Service\MSSQL$MSSQL2016Konten enthielt, über Windows Explorer die volle Kontrolle über die Berechtigungen erteilt .

Hier ist ein Microsoft-Artikel , der genau dieses Problem beschreibt.

Big H.
quelle
0

Erstellen Sie Ihre Datenbank neu. Löschen Sie es nicht und Ihre App sollte weiterhin funktionieren.

STLDev
quelle
4
Entschuldigung für die dumme Frage, aber wie erstelle ich die Datenbank neu?
John Mayer
Ooh - das könnte schlimmer sein als ich dachte. Haben Sie irgendwo eine Kopie der MDF-Datei? Woher hast du es ursprünglich? Möglicherweise haben Sie ein SQL Server-Skript, mit dem die Datenbank für Sie neu erstellt wird.
STLDev
Entschuldigung für die späte Antwort: Ich habe es mit dem folgenden Code generiert: public class OdeToFoodDB : DbContext { public DbSet<Restaurant> Restaurants { get; set; } public DbSet<RestaurantReview> Reviews { get; set; } } Und dann initialisiere ich es (aber hier bekomme ich den Fehler): OdeToFoodDB db = new OdeToFoodDB(); public ActionResult Index() { var model = db.Restaurants.ToList(); return View(model); }
John Mayer
Ich habe versucht, die dbcontext-Klasse umzubenennen, und jetzt funktioniert es. Was könnte das Problem verursacht haben?
John Mayer
0

Ich hatte den gleichen Fehler. Das Seltsame war, ich hatte ein neues Projektformular, dort funktionierte es perfekt und ein anderes, viel größeres Projekt, bei dem ich immer auf diese Fehlermeldung stieß.

Das perfekt funktionierende Projekt erstellt (fast) immer automatisch die Datenbank (einschließlich der Dateien). Es kann ein beliebiger Befehl sein, lesen, schreiben, aktualisieren. Die Dateien werden erstellt. Natürlich nutzt es

DropCreateDatabaseIfModelChanges

Es gibt nur einen Fall, in dem Probleme auftreten: WENN die MDF automatisch erstellt wird und Sie die MDF- und Protokolldatei löschen. Dann war es soweit. Verabschieden Sie sich von Ihrer Autokreation ...

Die einzige Möglichkeit, das Problem zu beheben, war wie folgt:

sqllocaldb stop v11.0 & sqllocaldb delete v11.0

Danach ist alles wieder normal (und alle anderen von LocalDB verwalteten Datenbanken sind ebenfalls verschwunden!).

EDIT: Das war nicht wahr. Ich habe es gerade ausprobiert und die Version 11.0 wird automatisch neu erstellt und alle MDFS bleiben verfügbar. Ich habe es nicht mit "nicht dateibasierten" LocalDBs versucht.

Das Verwirrende ist, ich habe auch diesen Fehler bekommen, wenn etwas anderes nicht stimmte. Mein Vorschlag ist also, wenn Sie sicherstellen möchten, dass Ihr DB-Setup solide und solide ist: Erstellen Sie eine neue Lösung / ein neues Projekt von Grund auf neu, verwenden Sie die grundlegendsten DB-Befehle (Entität hinzufügen, alle Entitäten anzeigen, alle Entitäten löschen) und sehen Sie ob es funktioniert.

Wenn JA, liegt das Problem irgendwo im Abgrund der VS2013-Konfiguration und -Versionierung sowie von Nuget und anderen Dingen.

WENN NEIN, haben Sie ein Problem mit Ihrer LocalDB-Installation.

Für alle, die wirklich verstehen wollen, was in EF vor sich geht (und ich bin mir immer noch nicht sicher, ob ich das tue :-)) http://odetocode.com/Blogs/scott/archive/2012/08/14/a-troubleshooting- Leitfaden für Entity-Framework-Verbindungen-Amp-Migrations.aspx

PS: Schieben Sie mich, wenn Sie das laufende Beispielprojekt benötigen.

Xan-Kun Clark-Davis
quelle
0

Seltsamerweise hat mir für genau das gleiche Problem geholfen, das 'auf' v11.0 'im folgenden Abschnitt der Konfiguration zu ändern.

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
Vaibhav
quelle
0

Ich bin kürzlich auf das gleiche Problem gestoßen. Hier ist eine Sache zu überprüfen. In Visual Studio gibt es drei Stellen, an denen wir die Datenbank überprüfen und entfernen sollten.

1. Solution Explorer's App_Data folder
2. Server Explorer's Data Connection menu
3. SQL Server Object Explorer

Wenn ich die Datenbank von den ersten beiden Punkten lösche, tritt der Fehler weiterhin auf. Daher musste ich die Datenbank auch aus dem SQL Server-Objekt-Explorer löschen. Dann könnte ich problemlos den Befehl 'update-database' ohne Fehler ausführen. Hoffe das hilft.

Foyzul Karim
quelle
0

Wir sind selbst darauf gestoßen, als wir dotnet ef database updateASP.Net Core 2.1 verwendet haben. Es sieht so aus, als würden relative Pfade nicht unterstützt AttachDbFileName.

System.Data.SqlClient.SqlException (0x80131904): Cannot attach the file '.\OurDbName.mdf' as database 'OurDbName'.

Ich wollte das hier nur für andere Leute ausdrücken, die vielleicht darauf stoßen. Der "Fix" verwendet absolute Pfade.

Siehe auch: https://github.com/aspnet/EntityFrameworkCore/pull/6446

John Reilly
quelle
0

Wenn Sie bereits Migrationen anwenden, kann dies das Problem beheben.

Gehen Sie zu Ihrer Web.config und aktualisieren Sie Ihre Verbindungszeichenfolge basierend auf Ihren Migrationsdateien.

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-GigHub-201802102244201.mdf;Initial Catalog=aspnet-GigHub-201802102244201;

Die Datenstrings sollten mit den ersten Nummern Ihrer Migrationen übereinstimmen.

Crismogramm
quelle
0

Stieß auf das ähnliche Problem nicht genau das gleiche. Ein Fall von Datenbank existierte bereits. Das Problem wurde durch folgenden Code gelöst.

<add name="DefaultConnection" connectionString="Data Source=.;AttachDbFilename=|DataDirectory|\aspnet-EjournalParsing-20180925054839.mdf;Initial Catalog=aspnet-EjournalParsing-20180925054839;Integrated Security=True"
      providerName="System.Data.SqlClient" />

Sumanstm21
quelle
Löschen Sie dieselbe Datei in der Datenquelle und geben Sie Ihren Standort an, der lokal oder
serverbezogen sein
0

In meinem Fall wurde Initail Cataloge=....das Problem durch Entfernen aus der Verbindungszeichenfolge behoben

Tes
quelle