Aracılığıyla paylaş


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:

Gecikmeli 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 bölümünde gecikmeli yükleme hakkında 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 enjekte etmek için parametreleri kullanabilirsiniz.

Bu konu hakkında daha fazla bilgi için varlık oluşturucusunun bölümünü parametreleriyle 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:

  • Enum'ları string 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 Tohumlama

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, OnModelCreatinggönderisi iç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
  • FromSql() sorgularında dönüş türü olarak görev yapma

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

Türetilmiş türler için dahil et

Artık Include yöntemi için ifadeler yazarken yalnızca türetilmiş türlerde tanımlanan gezinti özelliklerini belirtmek mümkün olacaktır. Include'nin kesin tür belirtimli versiyonu için, açık bir dönüştürme veya as işleci kullanmayı destekliyoruz. Artık Includedize sürümünde türetilmiş türlerde tanımlanan gezinti özelliğinin adlarına baş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 bölümünü, türetilmiş türlerle ekleme kısmı, 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, özelliklerin sınıflarda bildirildiği sırayla tablolar için başlangıçta sütunlar oluşturacak şekilde güncelledik. 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 yeni yöntemi etkinleştirmek için sorguyu değiştirmeniz gerekir.

Örneğin, aşağıdaki sorgu normalde Müşteriler için tek bir sorguya, döndürülen müşteri sayısı N olduğu için Siparişler için N ayrı sorguya dönüştürülür.

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

ToListAsync()'ı doğru yere ekleyerek, arabelleğin Siparişler için uygun olduğunu belirtmenin yanı sıra, 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 sahibi varlık türlerini yapılandırmak için, türü [Owned] ile açıklayarak ve ardından sahip varlığın modele eklenmiş olduğundan emin olarak 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 geçişleri kullanabilmek veya var olan bir veritabanından DbContext'in iskelesini oluşturmak için projede DotNetCliToolReference kullanılması artık 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ı

Yeni Tracked ve ChangeTracker'deki StateChanged olayları, 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, FromSql veya ExecuteSqlCommandgibi 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 bir uyarı görürsünüz çünkü minAge parametrelendirilmemiştir.

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, sorun izleyicimizikullanarak bildirin.