EF5: Nie można dołączyć pliku „{0}” jako bazy danych „{1}”

140

Mam problem dokładnie opisany tutaj (przeczytaj sekcję „Nie można dołączyć do usuniętego pliku MDF”), ale nie podano tam rozwiązania problemu ...

Krótko mówiąc, problem polega na tym, że po usunięciu .mdfpliku, następujący wyjątek jest zgłaszany, gdy próbuję uzyskać dostęp do bazy danych za pomocą EF 5.0.

DataException-> EntityException-> SqlException:
Nie można dołączyć pliku „{0}” jako bazy danych „{1}”

Usunąłem plik DB i teraz otrzymuję ten paskudny komunikat o błędzie podczas uruchamiania aplikacji, oczekując, że użyje swojego inicjatora. Jakiś sposób to naprawić?

Shimmy Weitzhandler
źródło
1
Przepraszam, że nie podałem konkretnej odpowiedzi, ale w tamtym czasie nie miałem rozwiązania, które działa w 100%. Próbuję teraz uniknąć tego błędu, nie używając baz danych dołączonych przez użytkowników. Generalnie mogłem naprawić błąd, łącząc się z SQL Server Management Studio i odłączając bazę danych w błędzie.
OdeToCode
Problem polega na tym, że baza danych już nie istnieje, ponieważ usunąłem już fizyczny plik. Właściwie starałem się o to zadbać w jednym ze studiów (zintegrowanym z VS i zewnętrznym). Moja odpowiedź naprawdę nie jest rozwiązaniem, ale raczej obejściem, po prostu mówi, że nie musisz trzymać się LocalDb.
Shimmy Weitzhandler
Od eksperta EF, Rowana Millera - patrz romiller.com/2013/05/17/… Mamy nadzieję, że w następnej wersji VS dostarczymy lepsze rozwiązania.
RickAndMSFT
Przydatny przewodnik dotyczący rozwiązywania problemów: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

Odpowiedzi:

220

Jeśli usuniesz plik DB, nadal pozostaje on zarejestrowany w SqlLocalDB. Czasami naprawia to usunięcie bazy danych. Możesz to zrobić z wiersza poleceń.

  1. Otwórz „Polecenie deweloperskie dla VisualStudio” w menu start / programy.
  2. Uruchom następujące polecenia:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

CodingWithSpike
źródło
1
Nie znalazłem Eksploratora obiektów Sql Server, chyba dlatego, że używam VS 2012 Express. Nie mogę więc wypróbować zaakceptowanej odpowiedzi. Jednak twoja odpowiedź zadziałała dla mnie idealnie. Dzięki.
newman
3
Twoja odpowiedź właśnie mnie uratowała. Nie mam podwęzła (localdb) \ v11.0 z zaakceptowanej odpowiedzi i nie mogłem usunąć odwołań z SQL Management Studio, więc hurra dla Ciebie!
Santux
18
To zadziałało po usunięciu plików. Możesz także uruchomić polecenia z Narzędzia -> Menedżer pakietów bibliotek -> Konsola Menedżera pakietów.
Bart Verkoeijen
11
Na marginesie, v11.0jest on specyficzny dla SQL LocalDB 2012. Jeśli używasz LocalDB 2014, MS zmieniło jego nazwę na MSSqlLocalDb.
CodingWithSpike
4
w odniesieniu do powyższego komentarza nie możesz też wpisać żadnej nazwy db i po prostu zastosuje się ona do twojej domyślnej, użyłem poniżej z vs2015 i zadziałało: sqllocaldb.exe stop sqllocaldb.exe usuń
Deviney
147

Dla tych, którzy wciąż szukają rozwiązania ...

Przejdź do View / SQL Server Object Explorer i usuń bazę danych z podwęzła (localdb) \ v11.0!
wprowadź opis obrazu tutaj

Zasadniczo zachowana jest lokalna baza danych, w której powinny znajdować się pliki, a jeśli chcesz usunąć pliki bazy danych, upewnij się, że usuwasz je z tego narzędzia eksploratora, a nie ręcznie.

JSobell
źródło
to mnie raz
ugryzło
8
Jeśli go nie widzisz. Po prostu dodaj nowe połączenie i wprowadź „(localdb) \ v11.0” (z uwierzytelnianiem systemu Windows). Może się to wydawać proste, ale przez chwilę wpatrywałem się w ekran. :)
Peter
@Peter Ok, dodałem bazę danych i teraz widzę moje 2 konteksty. Kiedy usuwam dane z tego widoku, pojawia się nowy błąd: „nie można pobrać poziomu dostępu do danych dla tej bazy danych”. Udało mi się to obejść, używając wiersza polecenia.
nVentimiglia
1
Podczas korzystania z domyślnej fabryki połączeń EF6 możesz zamiast tego używać mssqllocaldb. Zmień serwer na (LocalDb) \ mssqllocaldb i sprawdź, czy to się łączy. Istnieje kilka wersji LocalDb, a jedna nie pokazuje wszystkich.
Jim Yarbro
Poza tym to, czego doświadczyłem: Kliknij rozłącz, a następnie połącz się ponownie, jeśli nie widzisz już swojej bazy danych. (Odświeżanie nie pomaga)
StefanG
19

Najpierw wypróbowałem rozwiązanie JSobell, ale nie widziałem tam mojej bazy danych. Uruchomiłem polecenia CodingWithSpike z VS Developer Command Prompt, ale to też nie zadziałało. Wreszcie uruchomiłem te same polecenia CodingWithSpike z konsoli Menedżera pakietów i to zadziałało.

    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
źródło
9

W porządku.

Moje rozwiązanie było proste, zmieniłem na serwer lokalny:

Zmieniłem DataSourceatrybut w ciągu połączenia z:

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

Do:

Data Source=.\SQLEXPRESS;blah

Innym rozwiązaniem jest zalogowanie się do LocalDb przez SQL Management Studio i próba usunięcia tej bazy danych:

wprowadź opis obrazu tutaj

Jednak to nie zadziałało, kiedy próbuję go usunąć, wyświetla się „TITLE: Microsoft SQL Server Management Studio

Baza danych „{0}” nie istnieje na serwerze. (SqlManagerUI)

Kiedy próbuję go odłączyć, baza danych nie pojawia się na liście do odłączenia, „Przełącz w tryb offline” również przenosi mnie do powyższego błędu.

Co prowadzi mnie do wniosku, że jest to poważny błąd w LocalDB.

Shimmy Weitzhandler
źródło
Mam problemy przy próbie użycia lokalnej bazy danych z EF5
Nikos
LocalDB ma tę samą zaletę, że można ją uruchomić na swoim koncie lokalnym bez konieczności posiadania uprawnień administratora, tak jak IIS Express. Pozwala to na współdzielenie projektów z wieloma programistami bez konfigurowania IIS lub SQL Server dla każdego użytkownika.
Bart Verkoeijen
4

Najłatwiejszym rozwiązaniem jest po prostu zmiana nazwy bazy danych w ciągu połączenia. Zobacz blog Rowan Millers How to Drop a Database from Visual Studio 2012, aby uzyskać alternatywne rozwiązania. Mamy nadzieję, że rozwiążemy ten problem w przyszłej edycji.

RickAndMSFT
źródło
2

Najlepsza i łatwa odpowiedź Właśnie rozwiązałem to teraz, po prostu użyj nazwy serwera SQL jako źródła danych, początkowy katalog to nazwa bazy danych i gotowe, usuń wiersz mdf

utalentowany
źródło
1

W moim przypadku używam migracji iw konfiguracji po prostu zmieniłem nazwę klasy dataContext i dataContext (po prostu zmień nazwę), a następnie spróbuj ponownie i to pomogło

no0bassss
źródło
1

W przypadku SQL 2014 proszę postępować zgodnie z wybraną odpowiedzią CodingWithSpike i tym komentarzem

Na marginesie, wersja 11.0 jest specyficzna dla SQL LocalDB 2012. Jeśli używasz LocalDB 2014, firma MS zmieniła jej nazwę na MSSqlLocalDb . - CodingWithSpike 29 sierpnia 2014 o 19:20

Jeden
źródło
Pomocna uwaga, napotykam to podczas pracy nad starym projektem z VS 2015 Więcej informacji . Istnieją również podobne zmiany w VS 2013 od v11.0do ProjectsV12 . Przynajmniej na moim komputerze :-).
wyceluj
0

Miałem ten sam problem i rozwiązałem go, ręcznie ustawiając folder „DataDirectory” na inny folder w plikach binarnych mojej aplikacji.

Umieściłem tę linię w metodzie Global.asax Application_Start:

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

Moje parametry połączenia są obecnie ustawione na:

<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
źródło
Nie testowałem tego, ale to prawdopodobnie nie powinno działać. ponieważ DataDirectoryjest już App_Datadomyślnie ustawiony na lokalny , więc Twój kod nie robi nic, chyba że wcześniej zostanie to wyraźnie zmienione.
Shimmy Weitzhandler
JEŚLI wybierzesz to podejście, nie zmieniaj katalogu, zmień nazwę pliku MDF. Zobacz też romiller.com/2013/05/17/…
RickAndMSFT
0

Mogłem to naprawić, zmieniając nazwę DataBase w moim ciągu połączenia, z domyślnej nazwy aspnet- {Numery} na prostą nazwę, zadziałało.

Edgar Salazar
źródło
0

Połącz się z (LocalDb) \ v11.0 za pomocą Sql Server Management Studio, usuń bazę danych, a następnie wykonaj aktualizację bazy danych w konsoli menedżera pakietów.

Nidhin
źródło
0

Miałem ten sam problem. Uruchomiłem następujące polecenia w konsoli menedżera pakietów i naprawiłem problem

sqllocaldb.exe stop MSSqlLocalDb

sqllocaldb.exe delete MSSqlLocalDb
Tony Newsom
źródło