Aracılığıyla paylaş


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

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 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.

Ayrıca bkz.