Bagikan melalui


Yang Baru di EF Core 10

EF Core 10 (EF10) adalah rilis berikutnya setelah EF Core 9 dan dijadwalkan rilis pada November 2025.

EF10 tersedia untuk pratinjau. Lihat catatan rilis .NET 10 untuk informasi tentang pratinjau terbaru tersebut. Artikel ini akan diperbarui setiap kali rilis pratinjau baru tersedia.

Tips

Anda dapat menjalankan dan men-debug sampel dengan mengunduh kode sampel dari GitHub. Setiap bagian di bawah ini menautkan ke kode sumber khusus untuk bagian tersebut.

EF10 memerlukan .NET 10 SDK untuk membangun dan memerlukan runtime .NET 10 untuk dijalankan. EF10 tidak akan berjalan pada versi .NET sebelumnya, dan tidak akan berjalan pada .NET Framework.

Saran

Dokumen Apa yang Baru diperbarui untuk setiap versi pratinjau. Semua sampel disiapkan untuk menggunakan build harian EF10, yang biasanya memiliki pekerjaan yang sudah selesai beberapa minggu lebih awal dibandingkan dengan pratinjau build terbaru. Kami sangat mendorong penggunaan build harian saat menguji fitur baru agar Anda tidak melakukan pengujian terhadap versi yang usang.

Terjemahan LINQ dan SQL

Penyempurnaan kueri lainnya

  • Terjemahan untuk DateOnly.ToDateTime(timeOnly) (#35194, dikontribusikan oleh @mseada94).
  • Optimasi untuk beberapa LIMITberturut-turut (#35384), dikontribusikan oleh @ranma42).
  • Pengoptimalan untuk penggunaan operasi Count pada ICollection<T> (#35381), dikontribusikan oleh @ChrisJollyAU).

ExecuteUpdateAsync kini menerima lambda yang biasa bukan ekspresi

ExecuteUpdateAsync dapat digunakan untuk mengekspresikan operasi pembaruan arbitrer dalam database. Di versi sebelumnya, perubahan yang akan dilakukan pada baris database disediakan melalui parameter pohon ekspresi; ini membuatnya cukup sulit untuk membangun perubahan tersebut secara dinamis. Misalnya, mari kita asumsikan kita ingin memperbarui Tampilan Blog, tetapi secara kondisional juga Namanya. Karena argumen setters adalah pohon ekspresi, kode seperti berikut ini perlu ditulis:

// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
    s => s.SetProperty(b => b.Views, 8);

// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
    var blogParameter = Expression.Parameter(typeof(Blog), "b");

    setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
        Expression.Call(
            instance: setters.Body,
            methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
            typeArguments: [typeof(string)],
            arguments:
            [
                Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
                Expression.Constant("foo")
            ]),
        setters.Parameters);
}

await context.Blogs.ExecuteUpdateAsync(setters);

Membuat pohon ekspresi secara manual rumit dan rawan kesalahan, dan membuat skenario umum ini jauh lebih sulit daripada yang seharusnya. Dimulai dengan EF 10, Anda sekarang dapat menulis hal berikut sebagai gantinya:

await context.Blogs.ExecuteUpdateAsync(s =>
{
    s.SetProperty(b => b.Views, 8);
    if (nameChanged)
    {
        s.SetProperty(b => b.Name, "foo");
    }
});

Terima kasih kepada @aradalvand untuk mengusulkan dan mendorong perubahan ini (dalam #32018).