Upgrading from .NET Core 2.2 to .NET 6.0

Muhammet Balamir
SabancıDx
Published in
4 min readAug 31, 2022

Bildiğiniz gibi .NET’in iki ayrı frameworkü vardı. Bunlardan ilki .NET Framework diğeri ise .NET Core. .NET Framework cross-platform olmayan bir frameworktür.

Diğer platformlarda da hüküm sürmek isteyen Microsoft Haziran 2016'da .Net Core 1.0'ı duyurdu. 1.2, 2.0, 2.1, 2.2 ve 3.0 şeklinde versiyonlarına devam etti.

.NET Core 3.1 sürümünden sonra Kasım 2020'de .Net 5'i duyurdu. Peki neden .Net Core 4.0 olmadı?🤔 Çünkü .Net Framework 4.x ile isim karışıklığını önlemek ve bundan sonra .Net’in ana uygulaması olduğunu vurgulamak için “Core” kelimesi çıkartıldı.

.Net 5 ile .Net Core, .Net Framework, Xamarin ve Mono tek bir çatı altına toplamaya başladı.

The One Framework to Rule Them All

.NET 6 ise Kasım 2021'de çıktı LTS sürüm olduğu için 3 yıl destek alacak ve desteği Kasım 2024'te kesilecek.

SpaceDx Ekibi Olarak Biz Neden .NET 6.0'a Geçtik?
Biz mevcut projelerimizde .Net Core 2.2 kullanıyorduk. Aralık 2019'da desteğinin kesilmesi ve daha iyi performans alabilmek ve yeni özellikleri kullanabilmek için Microsoft’un şimdiye kadarki en hızlı .NET’i olan .NET 6.0'a geçtik. Şöyle ki EF Core 6.0'ın sorguları %31 daha hızlı yürütmesi, heap allocationların %43 iyileştirilmesi, Garbage Collector’daki değişiklikler ve çok daha fazlası bizim motivasyon kaynağımız oldu.

Detaylı incelemek için

1-Download .Net 6
Öncelikle .Net 6 SDK’yı indiriyoruz.
https://dotnet.microsoft.com/en-us/download/dotnet/6.0
Ardından komut satırına dotnet --version yazdıktan sonra kurulu olan sürümü görebiliriz.

dotnet --version

2- Framework Version Change
Projemize sağ tıklayıp özelliklere tıkladıktan sonra Uygulama>Genel kısmında Hedef Çerçeve kısmında .NET 6.0'yı seçip kaydediyoruz.

Project properties

Projenin .csproj’una çift tıkladıktan sonra açılan ekranın üst kısmında şunu görmemiz lazım.

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>10.0</LangVersion>
</PropertyGroup>

c# dil versiyon seçimi size kalmış fakat record struct, implicit using, lambda iyileştirmeleri gibi yeni özelliklerini kullanmak için yükseltmeniz tavsiye edilir.
c# 10 ile yeni gelen özellikler için bakınız:

NuGet paketlerini .NET 6 ile uyumlu versiyonlarına güncellemeden önce projenin dizinine gidip mevcuttaki bin ve obj klasörlerini silmeniz gerekebilir. Ayrıca aşağıdaki komutla da NuGet önbelleğini silebilirsiniz.

dotnet nuget locals --clear all

3- Startup.cs
Startup.cs içinde bazı değişiklikler yapmak zorundayız. Artık IHostingEnvironment değil IWebHostEnvironment olacak.

Swagger için bazı değişiklikler yaptık. Biz bearer authentication kullanıyoruz.

Changes for Swagger

4- ApplicationDbContext
ApplicationDbContext sınıfında hataya sebep olan değişiklikler vardı. DbQuery’leri DbSet olarak değiştirdik.

IHostingEnvironment IWebHostEnvironment olarak değiştirdik.
Yazdığımız db sorgularını ApplicationDbContext’teki DbSetler üzerinde execute ederken kullandığımız FromSql metodunu FromSqlInterpolated veya FromSqlRaw olarak değiştirdik.

5- Program.cs
Program.cs’te IWebHost kullanan yerler vardı bunları IHost olarak değiştirdik.

6- PostgreSQL DateTime
Biz PostgreSQL kullanıyoruz. .NET 6'da TimeZone ile alakalı DateTime problemi yaşadık. UTC timestampler PostgreSQL türleriyle uyumlu olarak UTC olmayan timespamp’lerden ayrılmıştır. Mümkün olduğunda UTC timestampleri kullanmayı öneriyorlar. Aşağıdaki satırı ekleyerek bu problemi çözdük.

AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);

Daha fazla bilgi için

7- HttpClient Authorization
HttpClient’ta call yaparken headera bearer token eklemimizi sağlayan SetBearerToken metodu kaldırıldı. Onun yerine ⏬

Simple Http Call

8-Dockerfile
Dockerfile’da yaptığımız değişiklikler şu şekilde.

9-Async Suffix In Controller

.Net Core 2.2'den .Net Core 3.0'a geçerken async son ekleri kaldırılmıştır. .Net Core 3.0'dan önce Product/ListAsync yolunu kullanırken 3.0'da Product/List şeklinde kullanılmaktadır. Eğer bu son eklerin kaldırılmamasını istiyorsak Startup.cs’e şu satırı eklemeliyiz. Defaultu true olarak geliyor.

services.AddMvc(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
});
Before and after added SuppressAsyncSuffixInActionNames in Startup.cs

Detaylara buradan bakabilirsiniz.

Sonuç
Production ortamda aktif bir şekilde kullanılan apilerimizi .Net Core 2.2'den .Net 6.0'a yükseltmek bizim için gerçekten çok sancılı bir süreçti. Çünkü 2.2'den 6.0'a çok fazla breaking changes vardı.
Breaking changes in .Net 6 🔽

Bir yandan da yeni özelliklerimize devam etmeliydik. .Net versiyon geçişlerinde arayı çok fazla açmamamız gerektiğini görmüş olduk. Sonuç itibariyle bütün apilerimizi başarılı bir şekilde .Net 6.0'a yükselttik. Umarım bu yazı faydalı olmuştur.

--

--