EF6’dan EF Core’a taşıma

Entity Framework Core veya kısaca EF Core, modern uygulama mimarileri için Entity Framework'ün toplam yeniden yazma işlemidir. Temel 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.

Uyarı

EF Core yalnızca modern .NET'i destekler ve .NET Framework'leri desteklemez. Bu nedenle, projeniz hala .NET Framework'i hedef alıyorsa, EF6'dan EF Core'a geçişinizi başlatmadan önce modern .NET'e geçmeniz gerekir. EF6'nın modern .NET'i desteklediğini unutmayın. Bu sayede EF6'yı koruyarak önce modern .NET'e geçiş yapabilir ve ardından EF6'dan EF Core'a geçişle başa çıkabilirsiniz.

Yükseltme nedenleri

Tüm yeni Entity Framework geliştirmesi EF Core'da gerçekleşiyor. Yeni özellikleri EF6'ya geri taşıma planı yoktur. EF Core en son .NET çalışma zamanlarında çalışır ve çalışma zamanı, platforma özgü (ASP.NET Core veya WPF gibi) ve dile özgü özelliklerden tam olarak yararlanır. Yükseltmeden elde ettiğiniz avantajlardan bazıları ş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 nedeniyle ağır sorgu kullanımında 40 kat azalma gördü. Birçok müşteri en son EF Core'a geçerek muazzam performans kazançları bildirmektedir.
  • EF Core'daki yeni özellikleri kullanın. EF6'ya yeni özellik eklenmez. Azure Cosmos DB sağlayıcısı ve DbContextFactorygibi tüm yeni işlevler yalnızca EF Core'a eklenir. 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 kullanarak uygulama yığınınızı modernleştirin ve gRPC ve GraphQL gibi teknolojilerle veri erişiminizi sorunsuz bir şekilde tümleştirin.

Geçişlerle ilgili bir not

Bu belgede, EF Core'un bir özelliği olan geçişler terimiyle karışıklığı önlemek amacıyla bağlantı noktası ve yükseltme terimleri kullanılı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şımanız için önerilen bir yaklaşım yoktur, bu nedenle EF Core'da "yeni" başlatmayı planlayın. EF6 geçişlerinizdeki kod tabanını ve verileri koruyabilirsiniz. EF6'da son geçişinizi uygulayın, ardından EF Core'da bir ilk geçiş oluşturun. EF Core'da ileriye doğru geçmişi takip edebileceksiniz.

Yükseltme adımları

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

EF Core "flavor"ınızı belirleme

EF Core'un etki alanı modelinizle ve veritabanı uygulamanızla nasıl çalıştığına yönelik çeşitli yaklaşımlar vardır. Genel olarak, çoğu uygulama bu desenlerden birini izler ve portunuza yaklaşımınız uygulamanın "türü"ne bağlıdır.

Gerçek kaynağı olarak kod , veri öznitelikleri, akıcı yapılandırma veya her ikisinin birleşimi aracılığıyla her şeyin kod ve sınıflar aracılığıyla modellendiği bir 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 tanımlanır, ancak bu ad tam olarak doğru değildir, çünkü bir yaklaşım mevcut bir veritabanıyla başlamak, varlıklarınızı oluşturmak ve ardından kod kullanarak bakımını sürdürmektir.

Gerçeğin kaynağı olarak Veritabanı yaklaşımı, kodunuzun veritabanından ters mühendislik veya yapı iskelesi oluşturma işlemini içerir. Şema değişiklikleri yapıldığında kod yeniden oluşturulur veya değişiklikleri yansıtacak şekilde güncelleştirilir. Bu genellikle "önce veritabanı" olarak adlandırılır.

Son olarak, daha gelişmiş bir Karma eşleme yaklaşımı, kod ve veritabanının ayrı olarak yönetilmesi ve EF Core'un ikisi arasında eşleme yapmak için kullanılması felsefesini izler. Bu yaklaşım genellikle geçişlerden kaçınır.

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

Yaklaşım Geliştirici rolü DBA rolü Geçişler Iskele Repo
Önce kodla 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 Mevcut Değil Varlıkları, DbContext'i ve geçişleri izleme
Veritabanı öncelikli Değişikliklerden sonra tersine mühendislik yapın ve oluşturulan varlıkları doğrulayın Veritabanı değiştiğinde yeniden yapılandırma yapmak için geliştiricileri bilgilendirin Mevcut Değil Şema değişikliği başına düşen işlem Oluşturulan varlıkları genişleten uzantıları/kısmi sınıfları izleme
Melez Varlıklar veya veritabanı her 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 bilgilendirin Mevcut Değil Mevcut Değil Varlıkları ve DbContext'i izleme

Karma 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 , Entity Data Model XML (EDMX) adlı özel bir model tanımı biçimini destekledi. EDMX dosyaları kavramsal şema tanımları (CSDL), eşleme belirtimleri (MSL) ve depolama şeması 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 yanlışlıkla EF Core'un yalnızca "önce kodu" desteklediği anlamına gelir. EF Core, önceki bölümde açıklanan üç uygulama modelini de destekler. Veritabanını tersine mühendislik ile EF Core'da modeli yeniden oluşturabilirsiniz. Varlık modelinizin görsel bir gösterimi için EDMX kullanıyorsanız, EF Core için benzer özellikler sağlayan açık kaynak EF Core Güç Araçları'nı kullanmayı göz önünde bulundurun.

EDMX dosyaları için destek eksikliğinin etkisi hakkında daha fazla bilgi için EDMX 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ışabilir (bkz. EF Core ve EF6'yı aynı uygulamada kullanma). Riski en aza indirmek için şunları göz önünde bulundurabilirsiniz:

  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. Sonunda kod tabanının geri kalanını EF Core'a getirin ve EF6 kodunu devre dışı bırakın.

Limanın kendisine gelince, genel olarak şunları yapacaksınız:

  1. EF6 ile EF Core arasındaki davranış değişikliklerini gözden geçirin.
  2. Varsa son geçişlerinizi EF6'da gerçekleştirin.
  3. EF Core projenizi oluşturun.
  4. Kodu yeni projeye kopyalayın, tersine mühendislik çalıştırın veya her ikisinin birleşimini kullanın.
  5. Başvuruları ve varlıkları yeniden adlandırın ve davranışları güncelleştirin:
    • System.Data.Entity'dan Microsoft.EntityFrameworkCore'e
    • Seçenekleri kullanmak ve/veya geçersiz kılmak için oluşturucuyu değiştirme DbContextOnConfiguring
    • DbModelBuilder'dan ModelBuilder'e
    • DbEntityEntry<T> EntityEntry<T> olarak yeniden adlandırma
    • Database.Log'dan Microsoft.Extensions.Logging (gelişmiş) veya DbContextOptionsBuilder.LogTo (basit) API'lere geçiş yapın.
    • WithRequired ve WithOptional için değişiklikleri uygulayın (buraya bakın)
    • Doğrulama kodunu güncelleştirin. EF Core'da yerleşik veri doğrulama yoktur, ancak bunu kendiniz yapabilirsiniz.
    • EDMX'ten bağlantı noktasına gitmek için gerekli tüm adımları izleyin.
  6. EF Core yaklaşımınıza göre belirli adımları gerçekleştirin:

Tüm yaklaşımlarla ilgili birçok önemli nokta vardır, bu nedenle EF6 ile EF Core arasındaki ayrıntılı farkları ele almanın ve bunlara geçici çözüm getirmenin yollarını da gözden geçirmek isteyeceksiniz.