EF6 ile EF Core Arasındaki Davranış Değişiklikleri

Bu, EF6 ile EF Core arasındaki davranış değişikliklerinin kapsamlı olmayan bir listesidir. Uygulamanızı taşırken bu unsurları göz önünde bulundurmanız önemlidir; bunlar, uygulamanızın davranış şeklini değiştirebilir, ancak EF Core'a geçiş yapıldıktan sonra derleme hatası olarak görünmezler.

Bu, taşıma işleminin bir parçası olarak dikkate alınması gereken üst düzey bir inceleme olarak amaçlanır. Daha ayrıntılı, duruma bağlı talimatlar için ayrıntılı vakaları okuyun.

DbSet.Add/Attach ve graph davranışı

EF6'da, bir varlıkta DbSet.Add() çağrılması, gezinti özelliklerinde başvurulan tüm varlıklar için özyinelemeli bir arama ile sonuçlanır. Bulunan ve bağlam tarafından henüz izlenmeyen varlıklar da eklendi olarak işaretlenir. DbSet.Attach() , tüm varlıkların değişmemiş olarak işaretlenmesi dışında aynı şekilde davranır.

EF Core benzer bir özyinelemeli arama gerçekleştirir ancak biraz farklı kurallar uygular.

  • Kök varlık oluşturulan bir anahtar için yapılandırılmışsa ve anahtar ayarlanmadıysa, Added durumuna geçirilir.
  • Gezinme özelliklerinin özyinelemeli araması sırasında bulunan varlıklar için:
    • Varlığın birincil anahtarı veritabanı tarafından otomatik oluşturulmuşsa
      • Birincil anahtar bir değere ayarlanmadıysa, durum eklenir olarak ayarlanır. Birincil anahtar değeri, özellik türü için CLR varsayılan değeri atanmışsa "ayarlanmadı" olarak kabul edilir (örneğin, 0, int için; null, string için vb.).
      • Birincil anahtar bir değere ayarlanırsa, durum değişmemiş olarak ayarlanır.
    • Birincil anahtar veritabanı oluşturulmamışsa, varlık kök ile aynı duruma getirilir.
  • Bu davranış değişikliği yalnızca Attach ve Update yöntemi grupları için geçerlidir. Add anahtar ayarlanmış olsa bile varlıkları her zaman Added durumuna getirir.
  • Attach yöntemleri, anahtarların ayarlandığı Unchanged varlıkları duruma koyar. Bu, "yeniyse ekleyin, aksi takdirde yalnız bırakın" yöntemlerini kolaylaştırır. Update yöntemleri, anahtarların ayarlandığı varlıkları Modified durumuna getirir. Bu, "yeniyse ekleyin, aksi takdirde güncelleştirin"i kolaylaştırır.

Buradaki genel felsefe, bağlantısız varlıkların Update eklemelerini ve güncelleştirmelerini işlemenin çok basit bir yoludur. Yeni varlıkların eklenmesini ve mevcut varlıkların güncelleştirilmesini sağlar.

Aynı zamanda, Add yine de varlıkların eklenmesini zorlamanın kolay bir yolunu sağlar. Ekleme, yalnızca depo tarafından oluşturulan anahtarları kullanmadığında kullanışlıdır; böylece EF varlığın yeni olup olmadığını bilmez.

EF Core'daki bu davranışlar hakkında daha fazla bilgi için EF Core'da Değişiklik İzleme'yi okuyun.

Code First veritabanı başlatma

EF6'nın veritabanı bağlantısını seçme ve veritabanını başlatma konularında gerçekleştirdiği pek çok karmaşık işlem bulunmaktadır. Bu kurallardan bazıları şunlardır:

  • Yapılandırma gerçekleştirilmezse, EF6 SQL Express veya LocalDb'de bir veritabanı seçer.
  • Bağlamla aynı isimde bir bağlantı dizesi uygulamanın App/Web.config dosyasındaysa, bu bağlantı kullanılacaktır.
  • Veritabanı yoksa oluşturulur.
  • Modeldeki tablolardan hiçbiri veritabanında yoksa, geçerli modelin şeması veritabanına eklenir. Geçişler etkinleştirilirse, veritabanını oluşturmak için kullanılır.
  • Veritabanı varsa ve EF6 daha önce şemayı oluşturduysa, şema geçerli modelle uyumlu olup olmadığını denetler. Şema oluşturulduktan sonra model değiştiyse bir istisna fırlatılır.

EF Core bu sihrin hiçbirini gerçekleştirmez.

  • Veritabanı bağlantısının kodda açıkça yapılandırılması gerekir.
  • Başlatma yapılmaz. Geçişleri uygulamak için (veya DbContext.Database.Migrate() ve DbContext.Database.EnsureCreated() geçişleri kullanmadan veritabanını oluşturmak/silmek için) kullanmanız EnsureDeleted() gerekir.

Code First tablo adlandırma kuralı

EF6, varlığın eşlendiği varsayılan tablo adını hesaplamak için çoğullaştırma hizmeti aracılığıyla varlık sınıfı adını çalıştırır.

EF Core, özelliğin türetilmiş bağlamda yer aldığı varlığın DbSet adını kullanır. Varlığın özelliği DbSet yoksa, sınıf adı kullanılır.

Daha fazla bilgi için Bkz. Veritabanı Şemalarını Yönetme.