Batasan Penyedia Database Inti SQLite EF
Penyedia SQLite memiliki sejumlah batasan migrasi. Sebagian besar batasan ini adalah hasil dari keterbatasan dalam mesin database SQLite yang mendasar dan tidak spesifik untuk EF.
Batasan pemodelan
Pustaka relasional umum (dibagikan oleh penyedia database relasional Kerangka Kerja Entitas) mendefinisikan API untuk konsep pemodelan yang umum untuk sebagian besar mesin database relasional. Beberapa konsep ini tidak didukung oleh penyedia SQLite.
- Skema
- Urutan
Batasan kueri
SQLite tidak secara asli mendukung jenis data berikut. EF Core dapat membaca dan menulis nilai jenis ini, dan kueri untuk kesetaraan (where e.Property == value
) juga didukung. Namun, operasi lain, seperti perbandingan dan pemesanan akan memerlukan evaluasi pada klien.
- DateTimeOffset
- Desimal
- TimeSpan
- UInt64
Alih-alih DateTimeOffset
, sebaiknya gunakan nilai DateTime. Saat menangani beberapa zona waktu, sebaiknya konversi nilai ke UTC sebelum menyimpan lalu mengonversi kembali ke zona waktu yang sesuai.
Jenis ini Decimal
memberikan tingkat presisi yang tinggi. Namun, jika Anda tidak memerlukan tingkat presisi tersebut, sebaiknya gunakan ganda sebagai gantinya. Anda dapat menggunakan pengonversi nilai untuk terus menggunakan desimal di kelas Anda.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Batasan migrasi
Mesin database SQLite tidak mendukung sejumlah operasi skema yang didukung oleh sebagian besar database relasional lainnya. Jika Anda mencoba menerapkan salah satu operasi yang tidak didukung ke database SQLite, maka NotSupportedException
akan dilemparkan.
Pembangunan kembali akan dicoba untuk melakukan operasi tertentu. Pembangunan kembali hanya dimungkinkan untuk artefak database yang merupakan bagian dari model EF Core Anda. Jika artefak database bukan bagian dari model--misalnya, jika dibuat secara manual di dalam migrasi--maka NotSupportedException
masih dilemparkan.
Operasi | Didukung? |
---|---|
TambahkanCheckConstraint | ✔ (membangun kembali) |
TambahkanColumn | ✔ |
AddForeignKey | ✔ (membangun kembali) |
AddPrimaryKey | ✔ (membangun kembali) |
TambahkanUniqueConstraint | ✔ (membangun kembali) |
AlterColumn | ✔ (membangun kembali) |
CreateIndex | ✔ |
CreateTable | ✔ |
DropCheckConstraint | ✔ (membangun kembali) |
DropColumn | ✔ (membangun kembali) |
DropForeignKey | ✔ (membangun kembali) |
DropIndex | ✔ |
DropPrimaryKey | ✔ (membangun kembali) |
DropTable | ✔ |
DropUniqueConstraint | ✔ (membangun kembali) |
Ganti namaColumn | ✔ |
Ganti namaIndex | ✔ (membangun kembali) |
Ganti NamaTable | ✔ |
Memastikan Skema | ✔ (no-op) |
DropSchema | ✔ (no-op) |
Sisipkan | ✔ |
Pembaruan | ✔ |
Hapus | ✔ |
Solusi batasan migrasi
Anda dapat mengatasi beberapa batasan ini dengan menulis kode secara manual dalam migrasi Anda untuk melakukan pembangunan ulang. Pembangunan ulang tabel melibatkan pembuatan tabel baru, menyalin data ke tabel baru, menghilangkan tabel lama, mengganti nama tabel baru. Anda harus menggunakan Sql(string)
metode untuk melakukan beberapa langkah ini.
Lihat Membuat Jenis Perubahan Skema Tabel Lainnya dalam dokumentasi SQLite untuk detail selengkapnya.
Batasan skrip idempogen
Tidak seperti database lain, SQLite tidak menyertakan bahasa prosedural. Karena itu, tidak ada cara untuk menghasilkan logika if-then yang diperlukan oleh skrip migrasi idempogen.
Jika Anda mengetahui migrasi terakhir yang diterapkan ke database, Anda dapat membuat skrip dari migrasi tersebut ke migrasi terbaru.
dotnet ef migrations script CurrentMigration
Jika tidak, sebaiknya gunakan dotnet ef database update
untuk menerapkan migrasi. Anda dapat menentukan file database saat menjalankan perintah.
dotnet ef database update --connection "Data Source=My.db"
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk