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 (Entity Framework 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ıralar

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
  • Ondalık
  • TimeSpan
  • UInt64

DateTimeOffsetyerine DateTime değerlerini 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 çift kullanmanızı öneririz. Sınıflarınızda ondalık 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. Bir 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)
Insert
Güncelleştir
Silme

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(string) 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"

Ayrıca bkz.