EF Core 2,1 ' deki yeni özellikler
Çok sayıda hata düzeltmesi ve küçük işlevsellik ve performans geliştirmelerinin yanı sıra EF Core 2,1 bazı etkileyici yeni özellikler içerir:
Geç yükleme
EF Core artık, herhangi bir kişinin gezinti özelliklerini isteğe bağlı olarak yükleyebilen varlık sınıfları yazmak için gerekli yapı taşlarını içerir. Ayrıca, en düşük düzeyde değiştirilen varlık sınıflarına (örneğin, sanal gezinti özelliklerine sahip sınıflar) göre yavaş yükleme proxy sınıfları oluşturmak için bu yapı taşlarından yararlanan yeni bir Microsoft. EntityFrameworkCore. proxy paketi oluşturduk.
Bu konu hakkında daha fazla bilgi için, yavaş yükleme bölümündeki bölümü okuyun.
Varlık oluşturuculardaki parametreler
Yavaş yükleme için gereken yapı taşlarından biri olarak, kurucularında parametre alan varlıkların oluşturulmasını etkinleştirdik. Özellik değerlerini eklemek, yavaş yükleme temsilcileri ve hizmetleri eklemek için parametreleri kullanabilirsiniz.
Bu konu hakkında daha fazla bilgi için, parametrelere sahip varlık Oluşturucu bölümünü okuyun.
Değer dönüştürmeleri
Artık EF Core, yalnızca temel alınan veritabanı sağlayıcısı tarafından desteklenen türlerin özelliklerini eşleyebilir. Değerler, herhangi bir dönüştürme olmadan sütunlar ve özellikler arasında geri ve ileri kopyalandı. EF Core 2,1 ' den başlayarak, değerlere uygulanmadan önce sütunlardan elde edilen değerleri dönüştürmek için değer dönüştürmeleri uygulanabilir ve tam tersi de geçerlidir. Kural ve özellikler arasında özel dönüştürmeleri kaydetmeye izin veren bir açık yapılandırma API 'SI de olmak üzere kurala göre uygulanabilen birkaç dönüştürmemiz vardır. Bu özelliğin bazı uygulamaları şunlardır:
- Numaralandırmaların dizeler olarak depolanması
- İşaretsiz tamsayılar SQL Server ile eşleme
- Özellik değerlerinin otomatik şifrelenmesi ve şifresinin çözülmesi
Bu konu hakkında daha fazla bilgi için değer dönüştürmeleriyle ilgili bölümü okuyun.
LINQ GroupBy çevirisi
Sürüm 2,1 ' den önce, EF Core GroupBy LINQ operatörü her zaman bellekte değerlendirilir. şimdi bunu en yaygın durumlarda SQL GROUP by yan tümcesine çevirmeyi destekliyoruz.
Bu örnek, çeşitli toplama işlevlerini hesaplamak için kullanılan GroupBy ile bir sorgu gösterir:
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 şuna benzer:
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üm ile bir veritabanını doldurmak için ilk verileri sağlamak mümkün olacaktır. EF6 'in aksine, dengeli dağıtım verileri model yapılandırmasının bir parçası olarak bir varlık türü ile ilişkilendirilir. Daha sonra EF Core geçişler, veritabanının yeni bir sürümüne yükseltilirken ekleme, güncelleştirme veya silme işlemlerinin uygulanması gerektiğini otomatik olarak hesaplar.
Örnek olarak bunu, içinde bir gönderi için çekirdek verileri yapılandırmak üzere kullanabilirsiniz OnModelCreating :
modelBuilder.Entity<Post>().HasData(new Post{ Id = 1, Text = "Hello World!" });
Bu konu hakkında daha fazla bilgi için veri dengeli dağıtım 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ürlerinde tanımlanmış anahtarlar yoktur ve eklenemez, silinemez veya güncelleştirilemez (yani, salt okunurdur), ancak sorgular tarafından doğrudan döndürülebilecek. Sorgu türleri için kullanım senaryolarından bazıları şunlardır:
- Birincil anahtarlar olmadan görünümlere eşleme
- Birincil anahtarlar olmadan tablolarla eşleme
- Modelde tanımlanan sorgularla eşleme
- Sorgular için dönüş türü olarak sunma
FromSql()
Bu konu hakkında daha fazla bilgi için sorgu türleri bölümünü okuyun.
Türetilmiş türler için bulundur
Artık Yöntem için ifadeler yazılırken türetilmiş türlerde tanımlanmış olan gezinti özelliklerini belirtmek mümkün olacaktır Include . Türü kesin belirlenmiş olan sürümü için Include , açık bir dönüştürme veya işleç kullanmayı destekliyoruz as . Ayrıca, öğesinin dize sürümündeki türetilmiş türlerde tanımlanan gezinti özelliği adlarına başvurmayı de destekliyoruz Include .
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 birlikte ekle bölümündeki bölümü okuyun.
System. Transactions desteği
TransactionScope gibi System. Transactions özellikleriyle çalışma yeteneği ekledik. bu, bunu 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ündeki bölümü okuyun.
İlk geçişte daha iyi sütun sıralaması
Müşteri geri bildirimlerine bağlı olarak, Özellikler sınıflarda bildirildiği sırada tablolar için ilk olarak sütunlar oluşturmak üzere geçişleri güncelleştirdik. İlk tablo oluşturulduktan sonra yeni üyeler eklendiğinde EF Core sırayı değiştiremediğini unutmayın.
Bağıntılı alt sorgular iyileştirmesi
"N + 1" adlı sorgu çevirimizi geliştirdik ve projeksiyondaki bir gezinti özelliğinin kullanımının, ilişkili bir alt sorgudan alınan verileri kök sorgudan birleştirmek için sunduğu çok sayıda yaygın senaryo SQL. İyileştirme, sorgunun sonuçlarını arabelleğe almayı gerektirir ve yeni davranışı kabul etmek için sorguyu değiştirmenizi gerektirir.
Örnek olarak, aşağıdaki sorgu normal olarak müşteriler için tek bir sorguya çevrilir, ek olarak N ("N" döndürülen müşterilerin sayısı) siparişlerin ayrı sorgularını alır:
var query = context.Customers.Select(
c => c.Orders.Where(o => o.Amount > 100).Select(o => o.Amount));
ToList()Doğru yere dahil ederek, arabelleğe alma işleminin, en iyi duruma getirmeyi sağlayan siparişlere uygun olduğunu belirtirsiniz:
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 çevrildiğine ve siparişler için bir diğeri müşterilere yönelik bir sonrakine sahip olduğunu unutmayın.
[Sahipli] özniteliği
Artık türe açıklama ekleyerek ve sonra sahip varlığın modele eklendiğinden emin olarak sahip olan 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; }
}
Komut satırı aracı DotNet-.NET Core SDK içinde yer alan EF
DotNet-EF komutları artık .NET Core SDK bir parçasıdır. bu nedenle, geçişleri kullanabilmeniz veya var olan bir veritabanından bir DbContext 'i kullanmak için artık projede Dotnetclientoolreference kullanılması gerekli olmayacaktır.
Farklı .NET Core SDK ve EF Core sürümleri için komut satırı araçlarının nasıl etkinleştirileceği hakkında daha fazla bilgi için araçları yükleme bölümüne bakın.
Microsoft. EntityFrameworkCore. soyutlamalar paketi
Yeni paket, bir bütün olarak EF Core bağımlılığı almadan EF Core özellikleri açmak için projelerinizde kullanabileceğiniz öznitelikleri ve arabirimleri içerir. Örneğin, [sahip] özniteliği ve ılazyloader arabirimi burada bulunur.
Durum değişikliği olayları
TrackedStateChanged ' Deki yeni ve olaylar ChangeTracker , DbContext ' i girerek veya durumlarını değiştirerek varlıklara yeniden davranan mantığı yazmak için kullanılabilir.
ham SQL parametresi çözümleyicisi
yeni bir kod çözümleyicisi, veya gibi ham SQL apı 'larımızın güvensiz kullanımlarını algılayan EF Core dahildir FromSqlExecuteSqlCommand . Örneğin, aşağıdaki sorgu için bir uyarı görürsünüz çünkü Minage parametreli değil:
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 güncelleştirilmiş veya en az test edilmiş EF Core 2,1 ile çalışacak şekilde kullanmanız önerilir.
İpucu
Yeni özelliklerde beklenmeyen bir uyumsuzluk veya herhangi bir sorun bulursanız veya bunlarla ilgili geri bildiriminiz varsa, lütfen sorun İzleyicisi'ni kullanarak bildirin.