Ca .NET 8 va .NET 9 se ngung nhan ban va sua loi bao mat vao ngay 10 thang 11 nam 2026. Hai phien ban cung het han vao mot ngay, du mot ban la LTS con ban kia la STS. Thay doi TargetFramework chi mat vai giay. Phan ton nhieu thoi gian hon la kiem tra nhung thu da thay doi ben duoi: EF Core dich truy van nhu the nao, mot BackgroundService bi loi co lam cac service khac khong khoi dong duoc hay khong, va SQLite se dien giai mot DateTimeOffset moi gap lan dau nhu the nao.
Toi da tu minh kiem tra tat ca cac muc trong bai nay tren ca hai SDK, chay song song truoc khi ghi lai.
Mục lục
EF Core 10
Hay bat dau voi Contains(). Mot truy van nhu context.Blogs.Where(b => ids.Contains(b.Id)) truoc day duoc EF Core 9 dich thanh mot tham so mang JSON duy nhat thong qua OPENJSON. Trong EF Core 10, mac dinh truy van duoc dich thanh nhieu tham so vo huong:
// EF Core 9: mot tham so JSON duy nhat
// WHERE [b].[Id] IN (SELECT [value] FROM OPENJSON(@__ids_0))
// EF Core 10: nhieu tham so vo huong, cung mot truy van, khong can sua ma nguon
// WHERE [b].[Id] IN (@ids1, @ids2, @ids3)
Ve mat chuc nang, hai cach la tuong duong. Tuy nhien, noi dung SQL da thay doi, trong khi bo nho ke hoach cua SQL Server lai dua tren chuoi SQL chinh xac. Vi vay, moi ke hoach da luu cho truy van nay se khong con phu hop ngay sau khi trien khai va se duoc bien dich lai o lan su dung tiep theo. Voi phan lon he thong, day chi la chi phi mot lan va kho nhan ra sau request dau tien.
Neu truy van chay lien tuc duoi tai cao, hoac kich thuoc tap hop thay doi rat nhieu va ung dung dang phu thuoc vao cach tai su dung ke hoach cu, ban nen theo doi thuc te thay vi bo qua. Hay kiem tra lai neu truoc day ban co ly do rieng de dua vao cach dich OPENJSON. Tren SQLite, thay doi nay the hien qua viec json_each(@__ids_0) duoc thay bang IN (@ids1, @ids2).
Toi da chay cung mot truy van LINQ tren cung mot co so du lieu SQLite voi hai phien ban EF Core trong kho ma nguon kem theo. File EFCORE.md co day du ket qua lay truc tiep tu terminal. Neu mot truy van cu the bi cham di, ban co the giu cach xu ly cu:
optionsBuilder.UseSqlServer(connectionString,
o => o.UseParameterizedCollectionMode(ParameterTranslationMode.Parameter));
Ten tham so cung thay doi theo cung nguyen nhan. @__city_0 gio chi con la @city. Ban than co so du lieu khong bi anh huong, nhung thay doi nay co the lam hong cac bai kiem thu so sanh SQL da sinh, hoac interceptor dang phan tich DbCommand.CommandText va tim mot ten tham so cu the.
ExecuteUpdateAsync cung khong con nhan mot expression tree nua. Neu ma nguon cua ban tao tham so bo gan cot bang Expression.Lambda<Func<...>> de tao cac loi goi SetProperty theo dieu kien, ma nguon se khong con bien dich. Kieu tham so gio la mot Func<...> thong thuong, va cach viet nay thuc te de hieu hon.
Ban khong can dung den truong hop tao expression dong de thay ro khac biet. Chi can dat mot cau if trong lambda cua ExecuteUpdateAsync tren EF Core 9 la du:
error CS1643: Not all code paths return a value in lambda expression of type ‘Func<SetPropertyCalls, SetPropertyCalls>’
Tham so khi do la mot expression tree that su, ma expression tree cua C# khong the chua cau lenh if. Cung doan ma nay bien dich binh thuong tren EF Core 10, vi tham so gio la mot delegate that su:
// EF Core 10 — gan gia tri theo dieu kien, khong can thao tac expression tree
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
s.SetProperty(b => b.Name, "foo");
});
Ten cot cua complex type cung duoc xu ly an toan hon. Noi cach khac, migration tiep theo cua ban co the khong con rong. EF Core 10 tu dong tao ten duy nhat cho cac cot cua complex type truoc day bi trung. Thuoc tinh cua complex type long nhau gio dung day du duong dan trong ten cot, chang han Complex_NestedComplex_Property thay vi chi la NestedComplex_Property.
Neu ban dang dung owned type hoac complex type, hay chay dotnet ef migrations add sau khi nang cap va doc ky phan thay doi truoc khi ap dung. Migration co the doi ten nhung cot ma ban khong chu dong yeu cau.
Mot thay doi de bo sot khac chi hien ra trong terminal, khong hien trong ma nguon: dotnet-ef gio yeu cau them --framework voi moi project co nhieu target framework, tuc dung <TargetFrameworks> thay vi <TargetFramework>.
Neu trong giai doan chuyen doi ban van giu ca net9.0 va net10.0, moi lenh dotnet ef deu can them --framework net10.0. Neu khong, lenh se dung lai voi thong bao rang project dang nham toi nhieu framework.
Thay doi toi se kiem tra dau tien la Microsoft.Data.Sqlite. Microsoft xep muc anh huong cua thay doi nay la cao, va co ly do ro rang: GetDateTimeOffset voi timestamp khong co offset gio mac dinh coi gia tri do la UTC thay vi mui gio cuc bo cua may.
Viec ghi mot DateTimeOffset vao cot REAL gio se chuyen gia tri sang UTC truoc khi ghi. Con GetDateTime voi timestamp co offset se tra ve DateTimeKind.Utc thay vi DateTimeKind.Local.
Thay doi nay co gay loi hay khong phu thuoc vao cach gia tri duoc ghi va noi no duoc doc lai. Mot ung dung chay tren mot may chu, luon ghi va doc timestamp khong co offset trong cung mui gio, van co the giu duoc tinh nhat quan noi bo. Rui ro thuc su xuat hien khi du lieu duoc ghi theo mot gia dinh nhung doc lai theo gia dinh khac: du lieu lich su tao truoc khi nang cap, hoac mot nhom may chu nam o nhieu mui gio khac nhau.
Toi da kiem tra truc tiep thay vi chi tin vao tai lieu. Toi ghi cung mot chuoi timestamp khong co offset vao cung mot file co so du lieu SQLite, sau do doc lai mot lan tren .NET 9 va mot lan tren .NET 10. Chi SDK duoc thay doi, dong du lieu van giu nguyen. Tren .NET 9, gia tri doc lai co offset +01:00, la offset cuc bo cua may tai thoi diem do. Tren .NET 10, gia tri la +00:00.
File SQLITE.md co huong dan day du neu ban muon tu lap lai. Trong luc kiem tra du lieu dang co trong co so du lieu, ban co the tam thoi dung cong tac sau:
AppContext.SetSwitch("Microsoft.Data.Sqlite.Pre10TimeZoneHandling", isEnabled: true);
ASP.NET Core 10
ASP.NET Core 10 cung co mot mau tuong tu EF Core: phan lon thay doi la cac API bi danh dau khong nen dung nua va trinh bien dich se thong bao, chang han WithOpenApi, bien dich Razor luc chay, hay goi Microsoft.Extensions.ApiDescription.Client.
Tuy nhien, co mot thay doi hanh vi luc chay ma khong co dau hieu nao khi bien dich. Chuyen huong dang nhap bang cookie gio bi vo hieu hoa voi cac endpoint API da duoc nhan dien.
Neu ung dung cua ban ket hop xac thuc bang cookie voi cac endpoint minimal API, ASP.NET Core 9 se chuyen huong request chua xac thuc sang trang dang nhap. Dieu nay gan nhu khong bao gio la hanh vi mong muon voi endpoint tra ve JSON. .NET 10 tra ve ma 401 thay vi chuyen huong.
Day la hanh vi dung hon, nhung neu giao dien phia truoc hoac bai kiem thu dang am tham phu thuoc vao chuyen huong, thay doi chi bieu hien bang mot ma trang thai khac. Khong co loi nao bi nem ra de bao hieu.
BackgroundService va cau hinh
Hai thay doi tiep theo cung thuoc nhom khong lam hong qua trinh bien dich, khong lam that bai buoc build, ma chi tao ra hanh vi khac khi ung dung da chay.
BackgroundService gio chay toan bo ExecuteAsync tren mot thread nen. Truoc day, phan dong bo, tuc moi thu truoc await dau tien, chay tren thread chinh trong qua trinh host khoi dong. Phan nay co the chan moi IHostedService dang ky sau no cho den khi ket thuc.
Phan lon thoi gian khong ai nhan ra dieu nay vi doan dong bo thuong chi gom vai phep gan. Tuy nhien, neu mot service lam viec cham hoac nem loi truoc await dau tien, cac service dang ky sau co the bi treo tai do, hoac khong bao gio duoc khoi dong.
Toi da kiem tra truong hop nay bang cach dang ky hai hosted service va cho service dau tien nem loi dong bo truoc moi await. Tren .NET 9, ExecuteAsync cua service thu hai khong bao gio chay; host that bai truoc khi service nay co co hoi bat dau.
Cung ma nguon tren .NET 10 cho thay service thu hai van khoi dong va ghi log binh thuong. Toan bo than phuong thuc gio chay tren thread nen ngay tu dau, vi vay loi dong bo cua service thu nhat khong con chan service thu hai.
Du vay, host van dung sau do trong ca hai truong hop, vi BackgroundServiceExceptionBehavior.StopHost van la gia tri mac dinh. Diem khac la cac service khac gio co co hoi khoi dong truoc khi host dung.
Co mot diem khac nen duoc tim rieng trong ma nguon: cac gia tri null gio duoc giu nguyen trong cau hinh. Truoc day, doan ma kiem tra IConfiguration["Key"] is null de phan biet “khong ton tai” voi “duoc dat ro rang thanh null” trong file JSON co the nhan ca hai truong hop la mot. Gio hai truong hop duoc phan biet ro hon. Hay kiem tra cac doan doc appsettings.json neu mot khoa cau hinh co the nhan gia tri null hop le.
SDK va CI
PackageReference khong co phien ban gio se tao loi NU1015 thay vi am tham chon mot phien ban dang troi. Vi vay, dong nhu <PackageReference Include="SomePackage" /> se khong con vo tinh dua vao co che quan ly goi tap trung ma ban chua cau hinh day du. Buoc restore se that bai thay vi tu chon mot phien ban va tiep tuc.
Nguon audit cua NuGet cung khong con cho phep dung HTTP khong an toan theo mac dinh. Neu CI dang tai goi tu mot feed noi bo qua HTTP thuong, dotnet restore se that bai tai buoc nay. Ban dau loi co the trong giong nhu mang chap chon, cho den khi nhan ra URL cua feed moi la nguyen nhan.
Thu tu nang cap de xuat
- Tren mot nhanh rieng, doi
TargetFrameworkthanhnet10.0, chay restore va doc tat ca canh bao. Phan lon cac thay doi “tu dong hoat dong” se bien thanh canh bao cua trinh bien dich, kem theo vi tri sua rat ro. - Neu project su dung complex type hoac owned type, hay chay
dotnet ef migrations add CheckNet10va doc phan thay doi truoc khi ap dung. Neu project van nham toi canet9.0vanet10.0, them--framework net10.0vao lenh. - Tim cac noi su dung
Microsoft.Data.Sqlitecung voiDateTimeOffsethoacDateTime. Day la muc duy nhat trong danh sach co the am tham lam thay doi cach dien giai du lieu. - Trien khai len moi truong staging va theo doi cac truy van
Contains()chay nhieu nhat khi co tai. Neu co chi phi bien dich lai ke hoach, ban se thay no o day. Voi phan lon he thong, day la chi phi mot lan, nhung khong nen gia dinh he thong cua ban cung nhu vay khi chua do luong. - Neu ung dung ket hop xac thuc bang cookie voi API endpoint, hay goi thu mot route API chua xac thuc va xac nhan ket qua la
401, khong phai chuyen huong.
Khong co thay doi nao qua dac biet. Van de nam o khoang cach giua “ung dung bien dich thanh cong” va “ung dung van hoat dong giong nhu tren .NET 9”. Ba thang la khoang thoi gian du de xu ly khoang cach nay neu bat dau ngay, thay vi cho den tuan truoc ngay 10 thang 11.
Ma nguon
Ban co the xem project chay day du, bao gom ca migrations, cung tat ca cau lenh SQL va dong log trong bai duoc ghi truc tiep tu dotnet run tren ca hai SDK tai DotNet10MigrationChecklist.



