Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dostawca SQLite ma szereg ograniczeń migracji. Większość tych ograniczeń wynika z ograniczeń w podstawowym silniku bazy danych SQLite i nie jest specyficzna dla Entity Framework (EF).
Ograniczenia modelowania
Wspólna biblioteka relacyjna (wykorzystywana przez dostawców relacyjnych baz danych platformy EF Core) definiuje interfejsy API do modelowania pojęć, które są wspólne dla większości silników relacyjnych baz danych. Kilka z tych pojęć nie jest obsługiwanych przez dostawcę SQLite.
- Schematy
- Sekwencje
- Tokeny współbieżności generowane przez bazę danych (zobacz dokumentację)
Ograniczenia zapytań
SqLite nie obsługuje natywnie następujących typów danych. Program EF Core może odczytywać i zapisywać wartości tych typów, a wykonywanie zapytań o równość (where e.Property == value) jest również obsługiwane. Inne operacje, takie jak porównanie i sortowanie, będą wymagały oceny na kliencie.
DateTimeOffsetdecimalTimeSpanulong
Zamiast DateTimeOffsetzalecamy używanie wartości DateTime. Podczas obsługi wielu stref czasowych zalecamy przekonwertowanie wartości na utc przed zapisaniem, a następnie przekonwertowanie z powrotem na odpowiednią strefę czasową.
Typ decimal zapewnia wysoki poziom dokładności. Jeśli jednak nie potrzebujesz tego poziomu dokładności, zalecamy użycie double zamiast tego. Możesz użyć konwertera wartości typu, aby nadal używać decimal w swoich klasach.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Ograniczenia migracji
Aparat bazy danych SQLite nie obsługuje wielu operacji schematu obsługiwanych przez większość innych relacyjnych baz danych. Jeśli spróbujesz zastosować jedną z nieobsługiwanych operacji do bazy danych SQLite, zostanie zgłoszony element NotSupportedException .
Przebudowa zostanie podjęta w celu przeprowadzenia określonych operacji. Ponowne kompilacje są możliwe tylko w przypadku artefaktów bazy danych, które są częścią modelu EF Core. Jeśli artefakt bazy danych nie jest częścią modelu — na przykład, jeśli został utworzony ręcznie wewnątrz migracji — NotSupportedException jest nadal wyrzucany.
| Operacja | Obsługiwane? |
|---|---|
| AddCheckConstraint | ✔ (ponowne kompilowanie) |
| DodajKolumnę | ✔ |
| AddForeignKey | ✔ (ponowne kompilowanie) |
| DodajKluczPodstawowy | ✔ (ponowne kompilowanie) |
| DodajUnikalneOgraniczenie | ✔ (ponowne kompilowanie) |
| AlterColumn | ✔ (ponowne kompilowanie) |
| UtwórzIndeks | ✔ |
| CreateTable | ✔ |
| UsuńOgraniczenieKontroli | ✔ (ponowne kompilowanie) |
| UsuńKolumnę | ✔ (ponowne kompilowanie) |
| DropForeignKey (usuń klucz obcy) | ✔ (ponowne kompilowanie) |
| DropIndex | ✔ |
| UsuńKluczGłówny | ✔ (ponowne kompilowanie) |
| DropTable | ✔ |
| UsuńUnikalneOgraniczenie | ✔ (ponowne kompilowanie) |
| Zmień nazwękolumny | ✔ |
| Zmień nazwę indeksu | ✔ (ponowne kompilowanie) |
| Zmień nazwę tabeli | ✔ |
| EnsureSchema | ✔ (bez operacji) |
| DropSchema | ✔ (no-op) |
| Insert | ✔ |
| Zaktualizuj | ✔ |
| Usuń | ✔ |
Obejście ograniczeń migracji
Niektóre z tych ograniczeń można obejść, ręcznie pisząc kod w migracjach, aby przeprowadzić ponowną kompilację. Ponowne kompilowanie tabeli obejmuje utworzenie nowej tabeli, skopiowanie danych do nowej tabeli, usunięcie starej tabeli, zmiana nazwy nowej tabeli. Aby wykonać niektóre z tych kroków, należy użyć Sql metody .
Aby uzyskać więcej informacji, zobacz Artykuł Making Other Kinds Of Table Schema Changes in the SQLite documentation (Wprowadzanie innych rodzajów zmian schematu tabeli w dokumentacji SQLite).
Ograniczenia idempotentnych skryptów
W przeciwieństwie do innych baz danych SQLite nie zawiera języka proceduralnego. W związku z tym nie ma możliwości wygenerowania logiki if-then wymaganej przez skrypty migracji idempotentnej.
Jeśli znasz ostatnią migrację zastosowaną do bazy danych, możesz wygenerować skrypt z tej migracji do najnowszej migracji.
dotnet ef migrations script CurrentMigration
W przeciwnym razie zalecamy użycie polecenia dotnet ef database update w celu zastosowania migracji. Podczas uruchamiania polecenia można określić plik bazy danych.
dotnet ef database update --connection "Data Source=My.db"
Ochrona równoczesnych migracji
Program EF9 wprowadził mechanizm blokowania migracji w celu ochrony przed współbieżnym wykonywaniem migracji. W przeciwieństwie do SQL Server, która używa blokady aplikacji na poziomie sesji (sp_getapplock), która jest automatycznie zwalniana po zamknięciu połączenia, SQLite nie ma wbudowanych blokad aplikacji. Zamiast tego program EF Core tworzy tabelę __EFMigrationsLock i wstawia wiersz w celu uzyskania blokady.
Obsługa porzuconych blokad
Jeśli aplikacja zostanie nieoczekiwanie zakończona (na przykład proces zostanie zabity podczas migracji), wiersz blokady w __EFMigrationsLock tabeli może nie zostać wyczyszczony. Zapobiega to zakończeniu każdej kolejnej migracji, ponieważ każda próba będzie czekać na zwolnienie blokady przez czas nieokreślony.
Aby rozwiązać problem z porzuconą blokadą, usuń tabelę __EFMigrationsLock z bazy danych:
DROP TABLE "__EFMigrationsLock";
Alternatywnie usuń wszystkie wiersze z tabeli:
DELETE FROM "__EFMigrationsLock";
Po wyczyszczeniu blokady kolejne operacje migracji są wykonywane normalnie. Tabela zostanie automatycznie utworzona ponownie zgodnie z potrzebami.