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 OnModelCreating
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
- 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ü Include
iç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 Include
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 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 ExecuteSqlCommand
gibi 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin