Photo by Brett Jordan on Unsplash

EF Core 7.0 ve Yenilikleri

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️
13 min readFeb 6, 2022

--

.Net 6 sürümü Kasım 2021 tarihinde yayınlandı. .Net 6 ile birlikte MAUI, Entity Framework Core, Asp.Net Core gibi ekosistemin diğer ürünleri de yayınlanan sürüm ile yeni özellikler, performans iyileştirmeleri gibi konularda güncellemeler aldı. Takip edip gördüğüm önemli değişiklikleri üç farklı yazı ve Enis Necipoğlu ile gerçekleştirdiğim online etkinlik ile yorumlamaya çalıştım. Bu yazılara ve etkinliğe ulaşmak için;

.NET 6 ve Yenilikleri — YouTube

bağlantılarını kullanabilirsiniz.

.Net 6 heyecanı artık geride kaldı. Kasım 2022 tarihinde yayınlanması beklenen yeni sürüm artık .Net 7. .Net 7 LTS (Long Term Support) almayacak. Bir sonraki LTS alacak sürüm 2023 yılında yayınlanacak .Net 8 olacaktır.
.Net 6 yayınlandıktan sonra Microsoft çalışanları tarafından EF Core 7.0 ile ilgili bir plan duyuruldu. Yayınlanan bu plan üzerinde istenilen özellikler, platform, ekosistem ve performans gibi başlıklar yer alıyor. Bu yazının amacı EF Core 7.0 için yapılan planı inceleyip derin bir dalış gerçekleştirmektir.

En Çok İstenen Özellikler

EF Coreyeni özellikleriyle ve en önemlisi her yeni sürümde artan parabolik performans iyileştirmeleriyle Dapper ile birlikte .Net ekosisteminde en çok kullanılan ORM araçları içerisinde yer alıyor. Community tarafından farklı projelerde kullanıldıkça farklı isterlere cevap verebilmesi için her yeni sürümde yeni özellikler EF Core içerisine ekleniyor.

Json Columns

Geliştirdiğimiz uygulamalarda varlıkları(entity) column based bir yapıda tasarlıyor ve kullanıcı isterlerine göre sorgulamalar gerçekleştiriyoruz. Ancak geliştirdiğimiz uygulamalar çoğu zaman kendi kendine çalışan bir uygulama değil, dış sistemlerle konuşan ve veri alışverişi gerçekleştiren senaryolar barındırabiliyor. Genellikle dış sistemlerle konuşurken json tipinde veriler kullanıyoruz. Bazı senaryolarda json tipinde olan bu verileri kendi uygulamamızın kullandığı veri tabanı teknolojisinde saklamak ve sorgulamak isteyebiliyoruz. Somut bir örnek verecek olursak, satın alma işlemleri için bir payment provider kullandığımızı varsayalım. Provider kullanıldıkça satın alma işlemini gerçekleştiren kullanıcı için transaction kayıtları oluşuyor. Bu kayıtları saklayıp, kullanıcının satın alma işlemini raporlamak istediğimizde karşımıza çıkan ilk sorun bu verinin sorgulanması oluyor. Dış bir sistemden gelen veriye güvenip veri tabanı tasarımını değiştiremeyiz. Bu sebeple gelen datayı json string tipine çevirerek saklıyoruz. Veri artık string tipinde olduğu için içerisinde bulunan bilgilere göre sorgulama yapmak oldukça zahmetli bir iş haline geliyor.

EF Core 7.0 ile aramıza katılması beklenen Json Columns özelliği ile artık bu verileri rahatça sorgulayabileceğiz.

Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

Map JSON values stored in database to EF properties · Issue #4021 · dotnet/efcore (github.com)

Bulk CUD Operations (Create-Update-Delete Without Loading Data Into Memory)

Oldukça önemli bir özellik. Bulk operations özellikle data memory’e çekilmeden gerçekleşirse ciddi performans artışları sağlayabiliyor.
Uzun süre EF Core kullandıktan sonra Mongo kullanınca bunu farkedebiliyorsunuz.

ZZZ extensions üzerinde zaten bu özellikler var ancak default olarak desteklenmesi daha güzel olacaktır.

ZZZ üzerinde bu özellikleri test etmek isterseniz aşağıdaki linki kullanabilirsiniz.

zzzprojects/EntityFramework.Extended: Add-on feature for Entity Framework (github.com)

Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

Bulk (i.e. set-based) CUD operations (without loading data into memory) · Issue #795 · dotnet/efcore (github.com)

LifeCycle Hook

ORM içerisinde bir çok olay gerçekleşir. Bu olaylar gerçekleştiğinde uygulamamız üzerinde belirtilen noktaların bilgilendirilmesi istenebilir.

Normalde 3.x sürümlerinden itibaren özellikle Interceptor özelliği ile bunu yapabiliyoruz. Sorgularımız çalışmadan önce, çalıştıktan sonra gibi durumlarda araya girip uygulamamızı notify edebiliyoruz.

EF 7 sürümü ile eksik olan hook tiplerinin eklenmesi planlanıyor.

Bu tipler içerisinde en çok istenen ObjectMeterialized olarak görünüyor.

Yani varlığın bir örneği oluşturulduğunda ve non-navigation olan tüm parametreler set edildikten sonra trigger olacak bir event gibi düşünebilirsiniz.

Süreci adım adım takip etmek isterseniz aşağıdaki linkleri kullanabilirsiniz.

Implement ObjectMaterialized event · Issue #15911 · dotnet/efcore (github.com)

Lifecycle hooks · Issue #626 · dotnet/efcore (github.com)

Value Objects

Öneri : EF Core içeresinde DDD-style value object kullanılmalıdır.

EF 7 içerisinde Domain-Driven-Desing için daha iyi bir deneyim planlanıyor.

Bu operasyon tamamiyle value converters üzerinde tamamlanacak.

Value Converters sadece ilgili column için etki ederken ilk olarak bu özelliği birden çok alana etki edecek bir sürüm ile yer değiştiricekler.

Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

Raw SQL Queries for Unmapped and Return Simple/Scalar Types

Şu anda ham SQL sorguları, modelde bir anahtar tanımlı olsun veya olmasın bir tür döndürmelidir. EF7'de, EF modelinde bulunmayan türleri doğrudan döndüren ham SQL sorgularına izin vermek planlanıyor.

Buradaki çalışma aynı zamanda Guid, DateTime, int ve string gibi basit/skaler türleri döndüren ham SQL sorgularını da kapsayacaktır.

Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

.NET platforms and ecosystem

EF7 için planlanan çalışmaların çoğu, farklı platformlar ve etki alanlarında .NET için veri erişim deneyiminin geliştirilmesini içerir. Bu, gerektiğinde EF Core’da çalışmayı ve ayrıca .NET teknolojilerinde harika bir deneyim sağlamak için diğer alanlarda çalışmayı içerir. EF7 sürümü için aşağıdaki platformlara/teknolojilere odaklanılacaktır:

  • .Net MAUI
  • Asp.Net Core
  • Azure Synapse
  • Blazor Server
  • Blazor WebAssembly
  • Windows Forms
  • WPF

Distributed Transactions

Distributed Transections işlemleri kullanan .Net Framework uygulamaları .Net 7 ‘ye taşınabilir.

.NET Framework’teki System.Transactions kitaplığı, Distributed Transactionsdesteklemek için Windows Distributed Transactions (DTC) kullanan yerel kodu içerir. Bu kod hiçbir zaman .NET Core’a taşınmadı. .NET 7'de, bu işlevselliği modern .NET’e getirme sürecini araştırmayı ve başlatmayı planlıyorlar. Bu, başlangıçta yalnızca Windowsiçin olacak ve yalnızca ADO.NETsağlayıcısının Distributed Transactions desteklediği veritabanı senaryolarını destekleyecektir. WCF’deki gibi Distributed Transactionsdiğer kullanımları .NET 7'de desteklenmeyecektir. Geri bildirim ve maliyete bağlı olarak, gelecekteki bir sürümde diğer senaryolar ve/veya Windows dışı platformlar için ekleyebileceklerini duyurdular.

Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

EF Core Tooling

Amaç : dotnet ef komutlarının kullanımını kolaylaştırmak ve modern platformlar ve teknolojilerle çalıştırmak.

.NET platformları, EF Core 1.0'da migrations , database scaffoldingvb. için araçları ilk kez tanıtıldığından beri gelişti. EF7'de, .NET MAUI gibi yeni platformları daha iyi desteklemek ve birden çok projenin kullanımı gibi alanlarda süreci kolaylaştırmak için toolmimarisinin güncellenmesi planlanıyor.

EF Core And Graphical User

EF Core, Windows Formsve .Net MAUIgibi data bindingsenaryolarıyla iyi çalışacak şekilde tasarlanmıştır. Ancak bu teknolojiler arasındaki noktaları birleştirmek her zaman kolay değildir. EF7 için, EF Core ile veriye bağlı uygulamalar oluşturmayı kolaylaştırmak için hem EF Core hem de Visual Studio’da çalışma deneyimini geliştirmek planlanıyor.

SQLServer.Core (Woodstar)

Microsotf.Data.SqlClient, SQL Server için tam özellikli bir ADO.NETveritabanı sağlayıcısıdır. Hem .Net Corehem de .Net Frameworküzerinde çok çeşitli SQL Serverözelliklerini destekler. Bununla birlikte, davranışları arasında birçok karmaşık etkileşim bulunan büyük ve eski bir kod tabanıdır.

.NET için yüksek performanslı bir SQL Serversürücüsünün potansiyelini araştırmak için geçen yıl, open source Woodstarolarak bilinen bir projeye oluşturuldu. EF7development time’da u projeye önemli ölçüde daha fazla yatırım yapılması planlanıyor.

Microsotf.Data.SqlClient’e yapılan yatırım değişmiyor. Hem EF Coreile hem de EF Coreolmadan SQL Serverve Azure SQL’e bağlanmanın önerilen yolu olmaya devam edecek. Yeni SQL Serverözelliklerini kullanıma sunuldukça desteklemeye devam edecektir.

Azure CosmosDb Provider

EF Core 6.0 sürümünde CosmosDb için önemli geliştirmeler yapıldı. Bu geliştirmelerin ne olduğunu merak ediyorsanız .Net 6 ve yeniliklerini incelediğim makaleye buradan ulaşabilirsiniz.

Bu sürümde de CosmosDb için yeni özellikler planlanıyor.
Süreci adım adım takip etmek isterseniz aşağıdaki linkleri kullanabilirsiniz.

https://github.com/dotnet/efcore/issues/17670

Migration Experience

EF Core6.0 sürümünde migration konusunda güzel gelişmeler vardı.

Migration Bundle özelliği ile tüm migration dosyalarını birleştirerek özellikle CD süreçlerinde işimizi kolaylaştıran adımlar atılmıştı.

Bu sürümde oldukça büyük bir epic üzerinde konuyu ele alacaklar.

Cloud ortamlarda yapılan testler ve geri bildirimlere göre Migration Bundle üzerinde Single Transaction kavramını getirmeyi düşünüyorlar.

epic oldukça çok fazla madde içeriyor eğer süreci adım adım takip etmek istiyorsanız aşağıdaki linki kullanabilirsiniz.

Trimming

EF Core çalışırken genellikle Runtime Code Generation gerçekleştirir. Xamarin ve Blazor gibi Linker Tree Shaking veya iOS gibi dynamic compilationizin vermeyen durumlarda Runtime Code Generation sorun çıkartabiliyor.

Bu noktada kullanılmayan kodların kırpılması EF7 ‘nin daha küçük boyutlara kavuştururken AOT compilation deneyimini iyileştirecektir.

Translate New LINQ Operators

.Net6 ile birlikte LINQ üzerine yeni yöntemler eklendi.

MaxBy , MinBy gibi eklenen bu yeni yöntemlerin EF7 üzerinde kullanılması amaçlanacak.

Süreci adım adım takip etmek için aşağıdaki linki kullanabilirsiniz.

Enhancements to System.Data

Her yeni release’de karşımıza çıkan .Net ortamlarında Database Access Management Api olarak karşımıza çıkan low-level System.Data üzerinde bazı iyileştirmeler ve özellikle Web Api projelerinde memory allocation minimum seviyede tutmak için iyileştirmeler yapılacağı planlanıyor.

Süreci adım adım takip etmek için aşağıdaki linki kullanabilirsiniz.

Reseacrh Data Access For Cloud-Native

EF7 geliştirilirken özellikle microservice cloud üzerinde çalışan uygulamalar için modern veri erişim yöntemlerini araştıracaklarını planlıyorlar.

Clear Path Forward From EF6

EF6 üzerinde geliştirilen uygulamaları EF7 üzerine taşırken çıkabilecek sorunları tespit etme ve bu sorunları giderme üzerine yatırım yapacaklarını planlıyorlar.

EF Core, eski EF6’nın kapsamadığı birçok senaryoyu her zaman destekledi ve genellikle çok daha yüksek performans gösterdi. Ancak EF6, EF Coretarafından kapsanmayan senaryoları da destekler. EF7, bu senaryoların çoğuna destekleyerek daha fazla uygulamanın eski EF6'dan EF7'ye taşınmasına olanak tanır. Aynı zamanda, eski EF6'dan EF Core’a geçiş yapan uygulamalar için kapsamlı bir taşıma kılavuzu planlanıyor.

Yukarıda bahsettiğimiz maddelerin çoğu bu bölümde de geçerli ancak bu bölümün önemli maddelerini aşağıdaki linklerden takip edebilirsiniz.

Performance

Mükemmel performance EF Core ve tüm .Net ‘in temel ilkesi haline geldi. Her sürümde performans konusunda ciddi yatırımlar yapıldı ve güzel sonuçlar elde edildi. Bu sürümde de performans konusunda araştırmalar ve iyileştirmelere yer verileceği planlanıyor.

Performance of Database Insert And Updates

Son birkaç sürümde Insert ve Update ile ilgili hem üretilen Sql cümlecikleri hem de Change-Tracking tarafında iyileştirmeler oldu.

Bu sürümde de özellikle veri tabanına gönderilen sorgularda bazı iyileştirmeler yapılması planlanıyor.

Burada yapılacak çalışmaların çoğu yukarıda en çok istenen özellikler kısmında bahsettiğim Bulk operasyonları içeriyor ancak SaveChange kısmında da performansı artıracak alanlar tespit edilmiş. Bu noktada da performans iyileştirmeleri planlanıyor.

Yine oldukça büyük bir epic . Süreci adım adım takip etmek isterseniz aşağıdaki linki kullanabilirsiniz.

TechEmpower Composite Score

Birkaç yıldır bir PostgreSQLveritabanına karşı .NET üzerinde TechEmpowerkıyaslamaları çalıştırılıyor. Son birkaç sürümde, hem düşük seviyeli veri erişimi hem de EF Coreiçin Fortuneskarşılaştırması önemli ölçüde geliştirildi.

EF7özellikle TechEmpowerpuanında iyileştirmeleri hedefliyor. Bu, daha geniş bir senaryo performansı ölçeceği hedefleniyor.

Miscellaneous features

Mevcut ve gelişen uygulama gereksinimlerini karşılamak için EF Core’da sürekli iyileştirme yapılacağı planlanıyor.

EF7için planlanan çeşitli özelliklerden bazıları şunlardır:

EF7 için duyurulan plan ve yapılan etkinliklerden aldığım notlar ve iş listesini şimdilik bunları içeriyor. İlerleyen zamanlarda gözden kaçırdığım maddeler olursa yazıyı güncellerim.

Yazdığınız kodlar production ortamında hatasız koşsun. Testler sizi korusun. 🙏

--

--

Furkan Güngör
Devops Türkiye☁️ 🐧 🐳 ☸️

Solution Developer — I want to change the world, give me the source code.