Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SQLite sağlayıcısının bir dizi geçiş sınırlaması vardır. Bu sınırlamaların çoğu, temel alınan SQLite veritabanı altyapısındaki sınırlamaların bir sonucu olup EF'ye özgü değildir.
Modelleme sınırlamaları
Ortak ilişkisel kitaplık (EF Core ilişkisel veritabanı sağlayıcıları tarafından paylaşılan), çoğu ilişkisel veritabanı altyapısı için ortak olan modelleme kavramları için API'leri tanımlar. Bu kavramlardan birkaçı SQLite sağlayıcısı tarafından desteklenmez.
- Şemalar
- Sıralamalar
- Veritabanı tarafından oluşturulan eşzamanlılık belirteçleri (belgelere bakın)
Sorgu sınırlamaları
SQLite, aşağıdaki veri türlerini yerel olarak desteklemez. EF Core bu türlerin değerlerini okuyabilir ve yazabilir ve eşitlik (where e.Property == value) sorgulaması da desteklenir. Ancak karşılaştırma ve sıralama gibi diğer işlemler istemcide değerlendirme gerektirir.
DateTimeOffsetdecimalTimeSpanulong
DateTimeOffsetyerine DateTime değerleri kullanmanızı öneririz. Birden çok saat dilimini işlerken, kaydetmeden önce değerleri UTC'ye dönüştürmenizi ve ardından uygun saat dilimine dönüştürmenizi öneririz.
türü decimal yüksek düzeyde duyarlık sağlar. Ancak bu hassasiyet düzeyine ihtiyacınız yoksa bunun yerine double kullanmanızı öneririz. Sınıflarınızda kullanmaya devam etmek için decimal kullanabilirsiniz.
modelBuilder.Entity<MyEntity>()
.Property(e => e.DecimalProperty)
.HasConversion<double>();
Geçiş sınırlamaları
SQLite veritabanı altyapısı, diğer ilişkisel veritabanlarının çoğunluğu tarafından desteklenen bir dizi şema işlemini desteklemez. Desteklenmeyen işlemlerden birini SQLite veritabanına uygulamayı denerseniz bir NotSupportedException oluşturulur.
Belirli işlemleri gerçekleştirmek için bir yeniden yapılandırma denenecek. Yeniden derlemeler yalnızca EF Core modelinizin parçası olan veritabanı yapıtları için mümkündür. Veritabanı yapıtı modelin parçası değilse (örneğin, bir geçiş içinde el ile oluşturulduysa) yine de bir NotSupportedException oluşturulur.
| Operasyon | Destekleniyor mu? |
|---|---|
| Kontrol Koşulu Ekle | ✔ (yeniden oluşturma) |
| SütunEkle | ✔ |
| AddForeignKey | ✔ (yeniden oluşturma) |
| BirincilAnahtarEkle | ✔ (yeniden oluşturma) |
| Benzersiz Kısıt Ekle | ✔ (yeniden oluşturma) |
| AlterColumn | ✔ (yeniden oluşturma) |
| DizinOluştur | ✔ |
| TabloOluştur | ✔ |
| Check Kısıtını Kaldır | ✔ (yeniden oluşturma) |
| SütunSil | ✔ (yeniden oluşturma) |
| Yabancı Anahtar Sil | ✔ (yeniden oluşturma) |
| DropIndex | ✔ |
| DropPrimaryKey | ✔ (yeniden oluşturma) |
| DropTable | ✔ |
| Benzersiz Kısıtlamayı Kaldır | ✔ (yeniden oluşturma) |
| RenameColumn | ✔ |
| YenidenAdlandırDizin | ✔ (yeniden oluşturma) |
| Tabloyu Yeniden Adlandır | ✔ |
| EnsureSchema | ✔ (işlem yapılmaz) |
| DropSchema | ✔ (işlem yapılmaz) |
| Ekle | ✔ |
| Güncelleştir | ✔ |
| Sil | ✔ |
Geçiş sınırlamaları geçici çözümü
Yeniden derleme gerçekleştirmek için geçişlerinizde el ile kod yazarak bu sınırlamaların bazılarına geçici çözüm getirebilirsiniz. Tablo yeniden derlemeleri, yeni tablo oluşturmayı, verileri yeni tabloya kopyalamayı, eski tabloyu bırakarak yeni tabloyu yeniden adlandırmayı içerir. Bu adımlardan bazılarının gerçekleştirilmesi için Sql yöntemini kullanmanız gerekir.
Daha fazla ayrıntı için SQLite belgelerinde Diğer Türlerde Tablo Şeması Değişiklikleri Yapma bölümüne bakın.
Tek etkili betik sınırlamaları
Diğer veritabanlarının aksine, SQLite yordam dili içermez. Bu nedenle, idempotent geçiş scriptleri için gerekli if-then mantığını oluşturmanın bir yolu yoktur.
Veritabanına uygulanan son geçişi biliyorsanız, bu geçişten en son geçişe bir betik oluşturabilirsiniz.
dotnet ef migrations script CurrentMigration
Aksi takdirde, dotnet ef database update kullanarak geçişleri uygulamanızı öneririz. komutunu çalıştırırken veritabanı dosyasını belirtebilirsiniz.
dotnet ef database update --connection "Data Source=My.db"
Eşzamanlı geçiş koruması
EF9, eşzamanlı geçiş yürütmelerine karşı koruma sağlamak için bir geçiş kilitleme mekanizmasını kullanıma sunar. Bağlantı kapatıldığında otomatik olarak yayımlanan oturum düzeyinde uygulama kilidi (sp_getapplock) kullanan SQL Server aksine, SQLite'te yerleşik uygulama kilitleri yoktur. BUNUN yerine EF Core bir __EFMigrationsLock tablo oluşturur ve kilidi almak için bir satır ekler.
Terk edilmiş kilitleri işleme
Uygulama beklenmedik bir şekilde sonlandırılırsa (örneğin, geçiş sırasında işlem sonlandırılırsa), tablodaki __EFMigrationsLock kilit satırı temizlenmeyebilir. Bu, sonraki tüm geçişlerin tamamlanmasını engeller çünkü her deneme kilidin serbest bırakılması için belirsiz bir süre bekler.
Terk edilmiş bir kilidi çözmek için veritabanından __EFMigrationsLock tablosunu silin.
DROP TABLE "__EFMigrationsLock";
Alternatif olarak, tablodaki tüm satırları da silebilirsiniz:
DELETE FROM "__EFMigrationsLock";
Kilidi temizledikten sonra sonraki geçiş işlemleri normal şekilde devam eder. Tablo gerektiğinde otomatik olarak yeniden oluşturulur.