SQLite EF Core Veritabanı Sağlayıcısı Sınırlamaları
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.
DateTimeOffset
decimal
TimeSpan
ulong
DateTimeOffset
yerine 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 decimal
kullanmaya devam etmek için değer dönüştürücüsü 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 yeniden derleme 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.
İşlem | Destekleniyor mu? |
---|---|
AddCheckConstraint | ✔ (yeniden oluşturma) |
AddColumn | ✔ |
AddForeignKey | ✔ (yeniden oluşturma) |
AddPrimaryKey | ✔ (yeniden oluşturma) |
AddUniqueConstraint | ✔ (yeniden oluşturma) |
AlterColumn | ✔ (yeniden oluşturma) |
CreateIndex | ✔ |
CreateTable | ✔ |
DropCheckConstraint | ✔ (yeniden oluşturma) |
DropColumn | ✔ (yeniden oluşturma) |
DropForeignKey | ✔ (yeniden oluşturma) |
DropIndex | ✔ |
DropPrimaryKey | ✔ (yeniden oluşturma) |
DropTable | ✔ |
DropUniqueConstraint | ✔ (yeniden oluşturma) |
RenameColumn | ✔ |
RenameIndex | ✔ (yeniden oluşturma) |
RenameTable | ✔ |
EnsureSchema | ✔ (işlem yapılmaz) |
DropSchema | ✔ (işlem yapılmaz) |
Ekleme | ✔ |
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 Sql bazılarını gerçekleştirmek için 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, etkili geçiş betikleri 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, geçişleri uygulamak için kullanmanızı dotnet ef database update
ö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, geçişleri yürütürken bir kilitleme mekanizmasını kullanıma sunar. Veritabanını bozuk durumda bırakabileceğinden, aynı anda gerçekleşen birden çok geçiş yürütmesine karşı koruma sağlamayı amaçlar. Bu, çalışma zamanında yöntemini kullanarak Migrate geçişlerin uygulanmasından kaynaklanan olası sorunlardan biridir (daha fazla bilgi için bkz . Geçişleri uygulama). Bunu azaltmak için EF, herhangi bir geçiş işlemi uygulanmadan önce veritabanında özel bir kilit oluşturur.
Ne yazık ki, SQLite'in yerleşik kilitleme mekanizması yoktur, bu nedenle EF Core ayrı bir tablo (__EFMigrationsLock
) oluşturur ve bunu kilitlemek için kullanır. Geçiş tamamlandığında ve tohumlama kodu yürütmeyi bitirdiğinde kilit serbest bırakılır. Ancak, herhangi bir nedenle geçiş kurtarılamaz bir şekilde başarısız olursa, kilit doğru şekilde serbest bırakılmayabilir. Bu durumda ardışık geçişlerin SQL yürütmesi engellenir ve bu nedenle hiçbir zaman tamamlanmaz. Veritabanındaki tabloyu silerek __EFMigrationsLock
engellerini el ile kaldırabilirsiniz.