7

Dla mojego zaskoczenia, używając inicjatora CreateDatabaseIfNotExists kontekstowe, liniaJak sprawdzić, czy schemat bazy danych pasuje do schematu Entity Framework?

context.Database.Initialize(true) 

nie wyjątek jeśli schemat nie pasuje do mojego kodu pierwszego schematu.

Czy istnieje sposób sprawdzenia poprawności, czy bieżąca baza danych pasuje do naszego schematu przed, na przykład, próbujemy uzyskać dostęp do encji, której tabela już nie istnieje w bazie danych, i wyjątek jest zgłaszany przez EF?

+1

jest teraz https://github.com/reckface/EntityFramework.Verify przez [@reckface] (https://stackoverflow.com/users/474702) do tego celu – user326608

+1

lepiej niż wcale! Szkoda, że ​​już nie używam EF :) –

Odpowiedz

13

Możesz wywołać CompatibleWithModel, aby ustalić, czy baza danych jest zgodna z modelem. Jeśli parametr zostanie ustawiony na wartość true, wygeneruje wyjątek, jeśli w bazie danych nie zostaną znalezione żadne dane modelu.

bool isCompatible = context.Database.CompatibleWithModel(true); 
+1

Jakiego rodzaju, jeśli wyrzucony wyjątek? – Jerther

+0

Sprawdziłem wewnętrzną EF i wydaje się, że NotSupportedException będzie trownego w przypadku braku metadanych w bazie danych. – Alexander

+0

Na marginesie próbowałem użyć tego w pierwszej aplikacji bazodanowej i może ona działać tylko z bazami danych Code-first. Ale dziękuję. –

6

EF nie sprawdza schematu bazy danych za pomocą modelu przy każdym uruchomieniu aplikacji. Zamiast tego szuka modelu zapisanego w bazie danych (tablica __MigrationsHistory i EdmMetadata) i porównuje ten zapisany model z modelem, którego używasz. Jeśli modele są zgodne, używana będzie baza danych. Jeśli modele nie są zgodne, wyjątek zostanie zgłoszony. Jeśli w bazie danych nie ma tabeli __MigrationHistory ani EdmMetadata, EF przyjmie, że używasz najpierw bazy danych Database z DbContext, a baza danych jest zgodna z modelem. Jeśli chcesz porównać bazę danych z modelem, możesz zrzucić Edmx do swojego modelu (używając EdmxWriter.WriteEdmx) i użyć Visual Studio i EF, aby pobrać edmx z bazy danych i porównać części SSDL.

+0

"EF założy, że używasz bazy danych najpierw z DbContext, a twoja baza danych pasuje do modelu". Za każdym razem, gdy uruchamiam moją aplikację, muszę sprawdzić, czy wszystkie tabele i wszystkie kolumny istnieją w bazie danych? –

+1

Jeśli nie zmienisz ani modelu, ani bazy danych i zostały one dopasowane wcześniej, prawdopodobnie nie musisz tego robić. Myślę, że niezależnie od technologii dostępu, z której korzystasz, ten problem istnieje, a proces rozwoju powinien zająć się tym problemem. Ponowne odnalezienie bazy danych w środowisku wykonawczym wydaje się być dla mnie błędnym podejściem. – Pawel

+1

@Pawel you don; t wydaje się mieć wysłane produkty! Klient instaluje produkt 1.0, a następnie aktualizuje go, co wymaga zmiany DB. Klient następnie instaluje nowy kod, ale z jakiegoś powodu nie powiedzie się, aby poprawnie zaktualizować schemat, a następnie uruchamia produkt i otrzymuje nieprzyjemny wyjątek, gdy kod próbuje odczytać brakujące kolumny. Lepiej więc najpierw sprawdzić, albo przynajmniej próbować sprawdzania poprawności, aby można było wyświetlić lepszy komunikat o błędzie, a następnie zakończyć. – gbjbaanb

Powiązane problemy