EF6’dan EF Core’a taşıma

Entity Framework Core veya kısaca EF Core, Entity Framework’ün modern uygulama mimarileri için baştan tasarlanmış sürümüdür. Temelde yapılan değişiklikler nedeniyle doğrudan yükseltme yolu yoktur. Bu belgenin amacı, EF6 uygulamalarınızı EF Core’a taşımaya yönelik uçtan uca bir kılavuz sağlamaktır.

Önemli

Taşıma işlemine başlamadan önce EF Core’un uygulamanız için veri erişim gereksinimlerini karşıladığını doğrulamanız önemlidir. İhtiyacınız olan her şeyi EF Core belgelerinde bulabilirsiniz.

Önemli

Taşınabilirlik çözümleyicinde, EF Core’u hatalı bir şekilde .NET 5 ve .NET 6 ile uyumsuz olarak bildiren bilinen bir sorun (microsoft/dotnet-apiport #993) vardır. EF Core, .NET 5 ve .NET 6 hedef çerçeveleriyle %100 uyumlu olduğundan bu uyarıları güvenle yoksayabilirsiniz.

Yükseltme nedenleri

Yeni Entity Framework geliştirmeleri tamamen EF Core’da yapılmaktadır. Yeni özelliklerin EF6 sürümüne geri aktarılması gibi bir plan yoktur. EF Core en son .NET çalışma zamanlarının üzerinde çalışır ve çalışma zamanı, platforma özgü (ASP.NET Core veya WPF gibi) ve dile özgü özelliklerden tam olarak yararlanır. Yükseltmeyle elde edeceğiniz avantajlardan birkaçı şunlardır:

  • EF Core’da devam eden performans geliştirmelerinden yararlanın. Örneğin EF6’dan EF Core 6’ya geçiş yapan bir müşteri, sorgu bölme özelliği sayesinde ağır sorgu kullanımında 40 kat azalma olduğunu gördü. Birçok müşteri yalnızca en son EF Core’a geçmenin bile muazzam performans kazançları sağladığını bildiriyor.
  • EF Core’daki yeni özellikleri kullanın. EF6’ya yeni özellik eklenmeyecek. Azure Cosmos DB sağlayıcısı ve DbContextFactory gibi yeni özellikler yalnızca EF Core’a eklenecek. EF Core'a özel çeşitli özellikler de dahil olmak üzere EF6'nın EF Core ile tam karşılaştırması için bkz. EF Core ve EF6 karşılaştırması.
  • Bağımlılık ekleme özelliğini kullanarak uygulama yığınınızı modernleştirin ve veri erişiminizi gRPC ve GraphQL gibi teknolojilerle sorunsuz bir şekilde tümleştirin.

Geçişlerle ilgili bir not

Bu belgede EF Core’un özelliklerinden biri olan geçiş ile karıştırılmaması için taşıma ve yükseltme terimleri kullanılmıştır. EF Core’daki geçişler, geçişlerin işlenme şekline yönelik önemli geliştirmeler nedeniyle EF6 Code First geçişleriyle uyumlu değildir. Geçiş geçmişinizi taşımak için önerilen bir yaklaşım yoktur. Bu nedenle EF Core’da “sıfırdan” başlayacak şekilde plan yapın. EF6 geçişlerinizdeki kod temelini ve verileri koruyabilirsiniz. EF6’da son geçişinizi uygulayın, ardından EF Core’da bir başlangıç geçişi oluşturun. Sonrasında EF Core’da geçmişinizi takip edebilirsiniz.

Yükseltme adımları

Yükseltme yolu, yükseltme aşamasına ve uygulama türüne göre düzenlenmiş birkaç belgeye ayrılmıştır.

EF Core varyantınızı belirleme

EF Core’un etki alanı modelinizle ve veritabanı uygulamanızla çalışma şekline yönelik çeşitli yaklaşımlar vardır. Genellikle çoğu uygulama bu desenlerden birini izler ve taşıma yaklaşımı, uygulama varyantına göre değişir.

Gerçeğin kaynağı olarak kod; veri öznitelikleri, akıcı yapılandırma veya her ikisinin birleşimiyle her şeyin kod ve sınıflar aracılığıyla modellendiği yaklaşımdır. Veritabanı başlangıçta EF Core’da tanımlanan modele göre oluşturulur ve diğer güncelleştirmeler genellikle geçişler aracılığıyla işlenir. Bu genellikle “önce kod” olarak adlandırılır ancak yaklaşımlardan biri var olan bir veritabanıyla başlamak, varlıklarınızı oluşturmak ve daha sonrasında kodla bakımını yapmak olduğundan bu adın tam olarak uygun olmadığı söylenebilir.

Gerçeğin kaynağı olarak veritabanı yaklaşımı, kodunuzun veritabanından tersine mühendislik veya yapı iskelesi ile oluşturulmasını kapsar. Şema değişiklikleri yapıldığında kod yeniden oluşturulur veya değişiklikleri yansıtacak şekilde güncelleştirilir. Bu yaklaşım genellikle “önce veritabanı” olarak adlandırılır.

Son olarak daha gelişmiş bir yaklaşım olan Hibrit eşleme yaklaşımı, kodun ve veritabanının ayrı olarak yönetilmesi ve EF Core’un ikisi arasında eşleme yapmak için kullanılması felsefesini benimser. Bu yaklaşım genellikle geçişleri zamanlar.

Aşağıdaki tabloda bazı üst düzey farklılıklar özetlenmiştir:

Yaklaşım Geliştirici rolü DBA rolü Geçişler Yapı iskelesi Repo
Önce kod Varlıkları tasarlama ve oluşturulan geçişleri doğrulama/özelleştirme Şema tanımlarını ve değişikliklerini doğrulama İşleme başına Yok Varlıkları, DbContext’i ve geçişleri izleme
Önce veritabanı Değişikliklerden sonra tersine mühendislik uygulama ve oluşturulan varlıkları doğrulama Yapı iskelesini yeniden oluşturmak için veritabanı değiştiğinde geliştiricileri bilgilendirme Yok Şema değişikliği başına Oluşturulan varlıkları genişleten uzantıları/parçalı sınıfları izleme
Hibrit Varlıklar veya veritabanı değiştiğinde eşlemek için akıcı yapılandırmayı güncelleştirme Varlıkları ve model yapılandırmasını güncelleştirebilmeleri için veritabanı değiştiğinde geliştiricileri bilgilendirme Geçersiz Geçersiz Varlıkları ve DbContext’i izleme

Hibrit yaklaşım, geleneksel kod ve veritabanı yaklaşımlarına kıyasla ek yük içeren daha gelişmiş bir yaklaşımdır.

EDMX’ten uzaklaşmanın etkisini anlama

EF6, Varlık Veri Modeli XML (EDMX) adlı özel bir model tanımı biçimini destekliyordu. EDMX dosyaları, kavramsal şema tanımları (CSDL), eşleme belirtimleri (MSL) ve depolama şema tanımları (SSDL) dahil olmak üzere birden çok tanım içerir. EF Core, iç model grafları aracılığıyla etki alanı, eşleme ve veritabanı şemalarını izler ve EDMX biçimini desteklemez. Birçok blog gönderisi ve makale hatalı bir şekilde bunun EF Core’un yalnızca “önce kodu” desteklediği anlamına geldiğini belirtmektedir. EF Core, yukarıdaki bölümde açıklanan üç uygulama modelini de destekler. Veritabanına tersine mühendislik uygulayarak modeli EF Core’da yeniden oluşturabilirsiniz. Varlık modelinizin görsel gösterimi için EDMX kullanıyorsanız, EF Core için benzer özellikler sağlayan açık kaynak EF Core Power Tools araçlarını kullanmayı değerlendirin.

EDMX dosyaları için destek sunulmamasının etkisi hakkında daha fazla bilgi için EDMX’i taşıma kılavuzunu okuyun.

Yükseltme adımlarını gerçekleştirme

Uygulamanın tamamını taşıma gereksinimi yoktur. EF6 ve EF Core aynı uygulamada çalıştırılabilir (bkz. EF Core ve EF6’yı aynı uygulamada kullanma). Riski en aza indirmek için şunları değerlendirebilirsiniz:

  1. Henüz yapmadıysanız .NET Core üzerinde EF6’ya geçin.
  2. Uygulamanızın küçük bir bölümünü EF Core’a geçirin ve EF6 ile yan yana çalıştırın.
  3. Sonrasında kod tabanının geri kalanını EF Core’a getirin ve EF6 kodunu devre dışı bırakın.

Taşıma sürecinin temel adımları şunlardır:

  1. EF6 ile EF Core arasındaki davranış değişikliklerini gözden geçirin.
  2. Varsa EF6’da son geçişlerinizi gerçekleştirin.
  3. EF Core projenizi oluşturun.
  4. Kodu yeni projeye kopyalayın, tersine mühendislik çalıştırın veya iki yöntemi birlikte kullanın.
  5. Başvuruları ve varlıkları yeniden adlandırın ve davranışları güncelleştirin:
    • System.Data.Entity - Microsoft.EntityFrameworkCore
    • Seçenekleri kullanmak için DbContext oluşturucusunu değiştirin ve/veya OnConfiguring bileşenini geçersiz kılın
    • DbModelBuilder - ModelBuilder
    • DbEntityEntry<T> için EntityEntry<T> adını kullanın
    • Database.Log yerine Microsoft.Extensions.Logging (gelişmiş) veya DbContextOptionsBuilder.LogTo (basit) API’lere geçin
    • WithRequired ve WithOptional (buraya bakın) değişikliklerini uygulayın
    • Doğrulama kodunu güncelleştirin. EF Core’da yerleşik veri doğrulama yoktur ancak bunu kendiniz yapabilirsiniz.
    • EDMX’ten taşımak için gerekli adımları izleyin.
  6. EF Core yaklaşımınıza göre belirli adımları gerçekleştirin:

Tüm yaklaşımlarla ilgili dikkat edilmesi gereken birçok nokta vardır. Bu nedenle EF6 ile EF Core arasındaki farkları incelemek ve bunlar için geçici çözümler bulmak da isteyeceksiniz.