EF Core 2.1'deki yeni özellikler

EF Core 2.1, çok sayıda hata düzeltmesi ve küçük işlevsel ve performans geliştirmelerinin yanı sıra bazı cazip yeni özellikler içerir:

Geç yükleme

EF Core artık herkesin gezinti özelliklerini isteğe bağlı olarak yükleyebilen varlık sınıfları yazabilmesi için gerekli yapı taşları içeriyor. Ayrıca, en az değiştirilmiş varlık sınıflarını (örneğin, sanal gezinti özelliklerine sahip sınıflar) temel alan gecikmeli yükleme proxy sınıfları oluşturmak için bu yapı taşları kullanan yeni bir Microsoft.EntityFrameworkCore.Proxies paketi oluşturduk.

Bu konu hakkında daha fazla bilgi için gecikmeli yükleme bölümünü okuyun.

Varlık oluşturucularındaki parametreler

Yavaş yükleme için gerekli yapı yapılarından biri olarak, oluşturucularında parametre alan varlıkların oluşturulmasını etkinleştirdik. Özellik değerlerini, gecikmeli yükleme temsilcilerini ve hizmetleri eklemek için parametreleri kullanabilirsiniz.

Bu konu hakkında daha fazla bilgi için varlık oluşturucusunun parametrelerle bölümünü okuyun.

Değer dönüştürmeleri

ŞIMDIYE kadar EF Core yalnızca temel veritabanı sağlayıcısı tarafından desteklenen türlerin özelliklerini yerel olarak eşleyebilse de. Değerler, herhangi bir dönüştürme olmadan sütunlar ve özellikler arasında ileri geri kopyalandı. EF Core 2.1'den başlayarak, değer dönüştürmeleri, özelliklere uygulanmadan önce sütunlardan alınan değerleri dönüştürmek için uygulanabilir ve bunun tersi de geçerlidir. Gerektiğinde kurala göre uygulanabilecek bir dizi dönüştürmenin yanı sıra sütunlar ve özellikler arasında özel dönüştürmelerin kaydedilmesine olanak tanıyan açık bir yapılandırma API'sine sahibiz. Bu özelliğin bazı uygulamaları şunlardır:

  • Sabit listeleri dize olarak depolama
  • SQL Server ile işaretsiz tamsayıları eşleme
  • Özellik değerlerini otomatik şifreleme ve şifre çözme

Bu konu hakkında daha fazla bilgi için değer dönüştürmeleri bölümünü okuyun.

LINQ GroupBy çevirisi

2.1 sürümünden önce EF Core'da GroupBy LINQ işleci her zaman bellekte değerlendirilir. Artık çoğu durumda SQL GROUP BY yan tümcesine çevirisini destekliyoruz.

Bu örnekte, çeşitli toplama işlevlerini hesaplamak için kullanılan GroupBy içeren bir sorgu gösterilmektedir:

var query = context.Orders
    .GroupBy(o => new { o.CustomerId, o.EmployeeId })
    .Select(g => new
        {
          g.Key.CustomerId,
          g.Key.EmployeeId,
          Sum = g.Sum(o => o.Amount),
          Min = g.Min(o => o.Amount),
          Max = g.Max(o => o.Amount),
          Avg = g.Average(o => o.Amount)
        });

Karşılık gelen SQL çevirisi şöyle görünür:

SELECT [o].[CustomerId], [o].[EmployeeId],
    SUM([o].[Amount]), MIN([o].[Amount]), MAX([o].[Amount]), AVG([o].[Amount])
FROM [Orders] AS [o]
GROUP BY [o].[CustomerId], [o].[EmployeeId];

Veri Çekirdeği Oluşturma

Yeni sürümle birlikte, veritabanını doldurmak için ilk verileri sağlamak mümkün olacaktır. EF6'nın aksine, tohumlama verileri model yapılandırmasının bir parçası olarak bir varlık türüyle ilişkilendirilir. Ardından EF Core geçişleri, veritabanını modelin yeni bir sürümüne yükseltirken hangi ekleme, güncelleştirme veya silme işlemlerinin uygulanması gerektiğini otomatik olarak hesaplayabilir.

Örneğin, içindeki bir Gönderi OnModelCreatingiçin tohum verilerini yapılandırmak için bunu kullanabilirsiniz:

modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });

Bu konu hakkında daha fazla bilgi için veri tohumlama bölümünü okuyun.

Sorgu türleri

EF Core modeli artık sorgu türlerini içerebilir. Varlık türlerinden farklı olarak, sorgu türleri üzerinde tanımlanmış anahtarlara sahip değildir ve eklenemez, silinemez veya güncelleştirilemez (yani salt okunurdur), ancak doğrudan sorgular tarafından döndürülebilir. Sorgu türleri için kullanım senaryolarından bazıları şunlardır:

  • Birincil anahtar içermeyen görünümlere eşleme
  • Birincil anahtarları olmayan tablolara eşleme
  • Modelde tanımlanan sorgulara eşleme
  • Sorgular için FromSql() dönüş türü olarak hizmet sunma

Bu konu hakkında daha fazla bilgi için sorgu türleri bölümünü okuyun.

Türetilmiş türler için ekle

Artık yöntemi için Include ifade yazarken yalnızca türetilmiş türlerde tanımlanan gezinti özelliklerini belirtmek mümkün olacaktır. türü kesin olarak belirlenmiş sürümü Includeiçin, açık bir atama veya as işleç kullanılmasını destekliyoruz. Artık dize sürümünde türetilmiş türlerde tanımlanan gezinti özelliğinin adlarına Includebaşvurmayı da destekliyoruz:

var option1 = context.People.Include(p => ((Student)p).School);
var option2 = context.People.Include(p => (p as Student).School);
var option3 = context.People.Include("School");

Bu konu hakkında daha fazla bilgi için Türetilmiş türlerle ekle bölümünü okuyun.

System.Transactions desteği

TransactionScope gibi System.Transactions özellikleriyle çalışma olanağı ekledik. Bu, onu destekleyen veritabanı sağlayıcıları kullanılırken hem .NET Framework hem de .NET Core üzerinde çalışır.

Bu konu hakkında daha fazla bilgi için System.Transactions bölümünü okuyun.

İlk geçişte daha iyi sütun sıralama

Müşteri geri bildirimlerine dayanarak, geçişleri başlangıçta özellikler sınıflarda bildirilirken aynı sırada tablolar için sütunlar oluşturacak şekilde güncelleştirdik. EF Core'un ilk tablo oluşturulduktan sonra yeni üyeler eklendiğinde sırayı değiştiremeyeceğini unutmayın.

bağıntılı alt sorguları iyileştirme

Projeksiyonda gezinti özelliğinin kullanımının kök sorgudaki verileri bağıntılı alt sorgudaki verilerle birleştirmeye yol açtığı birçok yaygın senaryoda "N + 1" SQL sorgularının yürütülmesini önlemek için sorgu çevirimizi geliştirdik. İyileştirme, alt sorgunun sonuçlarını arabelleğe almayı gerektirir ve sorguyu yeni davranışı kabul etmek için değiştirmeniz gerekir.

Örneğin, aşağıdaki sorgu normalde Müşteriler için tek bir sorguya, ayrıca Siparişler için ayrı sorgulara N (burada "N" döndürülen müşteri sayısıdır) ayrı sorgulara çevrilir:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount));

Doğru yere ekleyerek ToList() arabelleğin Siparişler için uygun olduğunu belirtirsiniz ve bu da iyileştirmeyi etkinleştirir:

var query = context.Customers.Select(
    c => c.Orders.Where(o => o.Amount  > 100).Select(o => o.Amount).ToList());

Bu sorgunun yalnızca iki SQL sorgusuna çevrileceğini unutmayın: Müşteriler için bir sorgu ve Siparişler için bir sorgu.

[Sahip olunan] özniteliği

Artık türüne açıklama ekleyip sahip varlığının modele eklendiğinden [Owned] emin olarak sahip olunan varlık türlerini yapılandırmak mümkündür:

[Owned]
public class StreetAddress
{
    public string Street { get; set; }
    public string City { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public StreetAddress ShippingAddress { get; set; }
}

.NET Core SDK'sında bulunan komut satırı aracı dotnet-ef

dotnet-ef komutları artık .NET Core SDK'sının bir parçasıdır, bu nedenle artık geçişleri kullanabilmek veya var olan bir veritabanından dbContext'in iskelesini oluşturmak için projede DotNetCliToolReference kullanılması gerekli olmayacaktır.

.NET Core SDK ve EF Core'un farklı sürümleri için komut satırı araçlarını etkinleştirme hakkında daha fazla bilgi için araçları yükleme bölümüne bakın.

Microsoft.EntityFrameworkCore.Abstractions paketi

Yeni paket, EF Core'a bir bütün olarak bağımlılık olmadan EF Core özelliklerini aydınlatmak için projelerinizde kullanabileceğiniz öznitelikler ve arabirimler içerir. Örneğin, [Owned] özniteliği ve ILazyLoader arabirimi burada bulunur.

Durum değişikliği olayları

New Tracked And StateChanged olayları ChangeTracker , DbContext'e giren veya durumlarını değiştiren varlıklara tepki veren mantık yazmak için kullanılabilir.

Ham SQL parametre çözümleyicisi

EF Core'a, veya ExecuteSqlCommandgibi FromSql ham SQL API'lerimizin güvenli olmayabilecek kullanımlarını algılayan yeni bir kod çözümleyicisi eklenmiştir. Örneğin, aşağıdaki sorgu için minAge parametresiz olmadığından bir uyarı görürsünüz:

var sql = $"SELECT * FROM People WHERE Age > {minAge}";
var query = context.People.FromSql(sql);

Veritabanı sağlayıcısı uyumluluğu

EF Core 2.1'i, EF Core 2.1 ile çalışacak şekilde güncelleştirilmiş veya en azından test edilmiş sağlayıcılarla kullanmanız önerilir.

Bahşiş

Yeni özelliklerde beklenmeyen bir uyumsuzluk veya sorun bulursanız ya da bunlar hakkında geri bildiriminiz varsa lütfen sorun izleyicimizi kullanarak bildirin.