C#, Entity framework, Code first - odtwarzanie bazy lub tabel gdy ich nie ma.

0

Mam w rozwiązaniu 2 projekty, usługę i aplikację desktopową WPF. Mają korzystać z wspólnej bazy MS SQl localdb. Przez pomyłkę w jednym z data modeli utworzyły mi się dwie różne bazy zamiast jednej (pewnie ze względu na różne data modele). Usunąłem niewłaściwą bazę i zmieniłem connection string w aplikacji WPF, aby wskazywał tę samą bazę, z której korzysta usługa. Niestety pluje się, że brakuje tam jednej z tabel. Podobnie jest gdy usuniemy ręcznie (lub zmienimy nazwę) bazę. Jak się zachować w takich sytuacjach, tzn:

  • Jak odtworzyć bazę jeśli nie istnieje?
  • Jak odtworzyć brakującą tabelę w istniejącej bazie?
0

A używasz migracji?

0

Ja bym poczytal dokumentację.
Podejrzewam, że masz w obu projektach kopie klas dla tabel.

0

@somekind: Nie.
@jacek.placek: Modele służące do budowy tabel są oddzielnymi projektami w tym samym rozwiązaniu. Czyli są wspólne dla obu w. w. projektów. Natomiast oddzielne są klasy pochodne od DBContext, choć są takie same, ale jak już wcześniej pisałem różniły się i dlatego utworzyła się druga baza.

0

To DbContext i wszystko co jest związane z bazą danych w tym projekcie. Drugi z WPF i t tzreci projekt dla serwisu.

3

@MarcinG: a szkoda, bo migracje to odpowiedź na oba Twoje pytania.

0

@MarcinG: A w jaki sposób tworzycie bazę w tym projekcie?

0
XardasLord napisał(a):

@MarcinG: A w jaki sposób tworzycie bazę w tym projekcie?

Baza utworzyła się sama na podstawie modeli, niestety tylko raz, przy pierwszym uruchomieniu.

0
somekind napisał(a):

@MarcinG: a szkoda, bo migracje to odpowiedź na oba Twoje pytania.

Utworzyłem migracje, ale w niczym to nie pomogło. Na starcie usługi dałem:

db.Database.CreateIfNotExists();

Przechodzi bez błędu, ale bazy jak nie było, tak nie ma.

3

Migracje trzeba odpalac recznie. Poza tym w systemach produkcyjnych zazwyczaj nawet tworzenia baz danych nie powierza sie automatycznej operacji w EF. Musisz po prostu nadrobic zaleglosci i nauczyc sie migracji, w przeciwnym razie tylko wiecej sobie szkody narobisz uzywajac EF. Nie wiem czy korzystasz z EF Core czy starszej wersji, ale tutaj dobry tutorial na start.

0

@Aventus: Korzystam z Entity Framework 6.4.4 (nie Core). Z migracji już wcześniej korzystałem. Chodzi mi o to, że skoro baza raz mogła się utworzyć automagicznie, to dlaczego nie dzieje się tak kolejnym razem, gdy ją usunę?

Update-Database

Nie tworzy mi tabeli. Pojawia się błąd:

Inner Exception 1:
EntityException: The underlying provider failed on Open.

Inner Exception 2:
SqlException: Cannot open database "DB" requested by the login. The login failed.
Login failed for user 'Komputer\Marcin'.

Dlaczego gdy przy pierwszym podejściu baza się utworzyła, nie było problemu z loginem, a teraz nagle jest?
Może gdzieś w jakimś pliku trzeba coś zmienić/usunąć, żeby program zachował się tak jakby bazy nigdy wcześniej nie było i ją utworzył.
Gdybym chciał rozpowszechniać program, to przecież nie będę tworzył bazy ręcznie każdemu za pomocą migracji. Program przy uruchamianiu powinien sprawdzać czy baza istnieje, jeżeli nie to ją tworzy. Przynajmniej tak bym to zrobił gdybym nie korzystał z EF. Myślałem, że EF zapewnia mi takie coś z automatu. Wygląda, że owszem ale tylko raz:)
W ostateczności można w instalatorze zamieścić pustą bazę, która zainstaluje się użytkownikom razem z aplikacją.

0

Pokaż folder z migracjami

Pokaż connection stringi

Pokaż screena z np. SQL Managementa co pokazuje na tym serwerze

Pokaż tabelę historii migracji

0

screenshot-20210519212248.png

         connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=Investor;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" 

Korzystam z MS SQL LocalDb, MS SQL Management Studio mi go nie widzi.
Tabeli migracji nie ma, bo nie ma bazy.

0

a jak wywalisz migracje i użyjesz tego

db.Database.CreateIfNotExists();

to co się dzieje?

0
jacek.placek napisał(a):

To DbContext i wszystko co jest związane z bazą danych w tym projekcie. Drugi z WPF i t tzreci projekt dla serwisu.

Utworzyłem oddzielny projekt typu Class Library na DBContext. Zainstalowałem do niego Entity Framework, ale nie mogę do niego dodać ADO.NET Entity Data Model. Brak go na liście możliwych do dodania.

Odpowiedź na przyszłość. Zamiast projektu typu Class Library (.Net Standard) należy utworzyć projekt typu Class Library (.Net Framework).

0

Problem rozwiązany.
Należy połączyć się za pomocą MS SQL Server Management Studio z serwerem o nazwie:
(LocalDB)\MSSQLLocalDB
Nie ma go na liście, więc trzeba tę nazwę wpisać z palca. Wybieramy "Windows Auhentication".
Na liście baz serwera wybieramy tę, która sprawia nam problem, klikamy PPM i z menu wybieramy "Detach".
Po tej operacji podczas startu aplikacji baza jest tworzona na nowo.
Dziękuję wszystkim za chęć pomocy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1