Aracılığıyla paylaş


EF Core 5.0'daki Yenilikler

Aşağıdaki liste EF Core 5.0'daki önemli yeni özellikleri içerir. Sürümdeki sorunların tam listesi için sorun izleyicimize bakın.

Önemli bir sürüm olarak EF Core 5.0, api geliştirmeleri veya mevcut uygulamaları olumsuz etkileyebilecek davranış değişiklikleri olan birkaç hataya neden olan değişiklik de içerir.

Çok-çok

EF Core 5.0, birleştirme tablosunu açıkça eşlemeden çoka çok ilişkileri destekler.

Örneğin, şu varlık türlerini göz önünde bulundurun:

public class Post
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Text { get; set; }
    public ICollection<Post> Posts { get; set; }
}

EF Core 5.0 bunu kurala göre çoka çok ilişki olarak tanır ve veritabanında otomatik olarak bir PostTag birleştirme tablosu oluşturur. Veriler, birleştirme tablosuna açıkça başvurmadan sorgulanabilir ve güncelleştirilebilir ve kod önemli ölçüde basitleştirilebilir. Birleştirme tablosu yine de özelleştirilebilir ve gerekirse açıkça sorgulanabilir.

Daha fazla bilgi için çoka çok belgelerine bakın.

Sorguları bölme

EF Core 3.0'dan başlayarak EF Core her zaman her LINQ sorgusu için tek bir SQL sorgusu oluşturur. Bu, kullanımdaki işlem modunun kısıtlamaları içinde döndürülen verilerin tutarlı olmasını sağlar. Ancak, sorgu birden çok ilgili koleksiyonu geri getirmek için bir projeksiyon kullandığında Include bu çok yavaş olabilir.

EF Core 5.0 artık ilgili koleksiyonları içeren tek bir LINQ sorgusuna birden çok SQL sorgusuna bölünmesine izin veriyor. Bu, performansı önemli ölçüde geliştirebilir, ancak veriler iki sorgu arasında değişirse döndürülen sonuçlarda tutarsızlığa neden olabilir. Seri hale getirilebilir veya anlık görüntü işlemleri, bunu azaltmak ve bölünmüş sorgularla tutarlılık elde etmek için kullanılabilir, ancak bu diğer performans maliyetlerine ve davranışsal farklara neden olabilir.

Örneğin, kullanarak Includeilişkili koleksiyonların iki düzeyini çeken bir sorgu düşünün:

var artists = context.Artists
    .Include(e => e.Albums)
    .ToList();

Varsayılan olarak EF Core, SQLite sağlayıcısını kullanırken aşağıdaki SQL'i oluşturur:

SELECT a."Id", a."Name", a0."Id", a0."ArtistId", a0."Title"
FROM "Artists" AS a
LEFT JOIN "Album" AS a0 ON a."Id" = a0."ArtistId"
ORDER BY a."Id", a0."Id"

Bölünmüş sorgularda bunun yerine aşağıdaki SQL oluşturulur:

SELECT a."Id", a."Name"
FROM "Artists" AS a
ORDER BY a."Id"

SELECT a0."Id", a0."ArtistId", a0."Title", a."Id"
FROM "Artists" AS a
INNER JOIN "Album" AS a0 ON a."Id" = a0."ArtistId"
ORDER BY a."Id"

Bölünmüş sorgular, yeni AsSplitQuery işleç LINQ sorgunuzun herhangi bir yerine veya genel olarak modelinizin OnConfiguringiçine yerleştirilerek etkinleştirilebilir. Daha fazla bilgi için bölünmüş sorgular hakkındaki tüm belgelere bakın.

Basit günlüğe kaydetme ve gelişmiş tanılama

EF Core 5.0, yeni LogTo yöntemle günlüğe kaydetmeyi ayarlamanın basit bir yolunu tanıtır. Aşağıdakiler, EF Core tarafından oluşturulan tüm SQL'ler de dahil olmak üzere günlük iletilerinin konsola yazılmasına neden olur:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);

Buna ek olarak, artık herhangi bir LINQ sorgusunu çağırarak ToQueryString sorgunun yürüteceği SQL'i almak mümkündür:

Console.WriteLine(
    ctx.Artists
    .Where(a => a.Name == "Pink Floyd")
    .ToQueryString());

Son olarak, çeşitli EF Core türleri iç özelliklere ayrıntılı bir görünüm sağlayan gelişmiş DebugView bir özellik ile donatılmıştır. Örneğin, ChangeTracker.DebugView belirli bir anda tam olarak hangi varlıkların izlendiğini görmek için danışılabilir.

Daha fazla bilgi için günlüğe kaydetme ve kesme belgelerine bakın.

Filtrelenmiş ekleme

Include Yöntemi artık dahil edilen varlıkları filtrelemeyi destekliyor:

var blogs = context.Blogs
    .Include(e => e.Posts.Where(p => p.Title.Contains("Cheese")))
    .ToList();

Bu sorgu, blogları ilişkili her gönderiyle birlikte ancak yalnızca gönderi başlığında "Peynir" bulunduğunda döndürür.

Daha fazla bilgi için filtrelenmiş ekleme ile ilgili tüm belgelere bakın.

Tür başına tablo (TPT) eşlemesi

VARSAYıLAN olarak EF Core, .NET türlerinin devralma hiyerarşisini tek bir veritabanı tablosuyla eşler. Bu, hiyerarşi başına tablo (TPH) eşlemesi olarak bilinir. EF Core 5.0, devralma hiyerarşisindeki her .NET türünün farklı bir veritabanı tablosuna eşlenmesini de sağlar; tür başına tablo (TPT) eşlemesi olarak bilinir.

Örneğin, eşlenmiş hiyerarşisi olan bu modeli göz önünde bulundurun:

public class Animal
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Cat : Animal
{
    public string EducationLevel { get; set; }
}

public class Dog : Animal
{
    public string FavoriteToy { get; set; }
}

TPT ile, hiyerarşideki her tür için bir veritabanı tablosu oluşturulur:

CREATE TABLE [Animals] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    CONSTRAINT [PK_Animals] PRIMARY KEY ([Id])
);

CREATE TABLE [Cats] (
    [Id] int NOT NULL,
    [EducationLevel] nvarchar(max) NULL,
    CONSTRAINT [PK_Cats] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Cats_Animals_Id] FOREIGN KEY ([Id]) REFERENCES [Animals] ([Id]) ON DELETE NO ACTION,
);

CREATE TABLE [Dogs] (
    [Id] int NOT NULL,
    [FavoriteToy] nvarchar(max) NULL,
    CONSTRAINT [PK_Dogs] PRIMARY KEY ([Id]),
    CONSTRAINT [FK_Dogs_Animals_Id] FOREIGN KEY ([Id]) REFERENCES [Animals] ([Id]) ON DELETE NO ACTION,
);

Daha fazla bilgi için TPT ile ilgili tüm belgelere bakın.

Esnek varlık eşlemesi

Varlık türleri genellikle EF Core'un bu tür için sorgu yaparken tablonun veya görünümün içeriğini geri çekmesi için tablolara veya görünümlere eşlenir. EF Core 5.0, bir varlığın bir SQL sorgusuna ("sorgu tanımlama" olarak adlandırılır) veya tablo değerli bir işleve (TVF) eşlenebildiği ek eşleme seçenekleri ekler:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Post>().ToSqlQuery(
        @"SELECT Id, Name, Category, BlogId FROM posts
          UNION ALL
          SELECT Id, Name, ""Legacy"", BlogId from legacy_posts");

    modelBuilder.Entity<Blog>().ToFunction("BlogsReturningFunction");
}

Tablo değerli işlevler, bir DbSet yerine .NET yöntemiyle eşlenebilir ve parametrelerin geçirilmesine olanak sağlar; eşleme ile HasDbFunctionayarlanabilir.

Son olarak, artık bir varlığı sorgularken (veya bir işlevle veya sorgu tanımlarken) bir görünüme ancak güncelleştirirken bir tabloya eşlemek mümkündür:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Blog>()
        .ToTable("Blogs")
        .ToView("BlogsView");
}

Paylaşılan tür varlık türleri ve özellik torbaları

EF Core 5.0, aynı CLR türünün birden çok farklı varlık türüne eşlenmesine izin verir; bu tür türler, paylaşılan tür varlık türleri olarak bilinir. Bu özellik ile herhangi bir CLR türü kullanılabilir ancak .NET Dictionary , "özellik torbaları" olarak adlandırdığımız özellikle cazip bir kullanım örneği sunar:

public class ProductsContext : DbContext
{
    public DbSet<Dictionary<string, object>> Products => Set<Dictionary<string, object>>("Product");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.SharedTypeEntity<Dictionary<string, object>>("Product", b =>
        {
            b.IndexerProperty<int>("Id");
            b.IndexerProperty<string>("Name").IsRequired();
            b.IndexerProperty<decimal>("Price");
        });
    }
}

Bu varlıklar daha sonra kendi ayrılmış CLR türüne sahip normal varlık türleri gibi sorgulanabilir ve güncelleştirilebilir. Daha fazla bilgi için bkz. Tesis çantaları.

Gerekli 1:1 bağımlıları

EF Core 3.1'de, bire bir ilişkinin bağımlı sonu her zaman isteğe bağlı olarak kabul edilirdi. Bu, sahip olunan varlıklar kullanılırken en belirgin şekilde görünürdü çünkü sahip olunan tüm varlığın sütunu modelde gerektiği gibi yapılandırılmış olsalar bile veritabanında null atanabilir olarak oluşturuldu.

EF Core 5.0'da, sahip olunan bir varlığa yönelik gezinti gerekli bir bağımlı olarak yapılandırılabilir. Örneğin:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>(b =>
    {
        b.OwnsOne(e => e.HomeAddress,
            b =>
            {
                b.Property(e => e.City).IsRequired();
                b.Property(e => e.Postcode).IsRequired();
            });
        b.Navigation(e => e.HomeAddress).IsRequired();
    });
}

DbContextFactory

EF Core 5.0, uygulamanın bağımlılık ekleme (D.I.) kapsayıcısında DbContext örnekleri oluşturmak için fabrikayı tanıtır AddDbContextFactory ve AddPooledDbContextFactory kaydeder; uygulama kodunun bağlam örneklerini el ile oluşturması ve atması gerektiğinde bu yararlı olabilir.

services.AddDbContextFactory<SomeDbContext>(b =>
    b.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=Test"));

Bu noktada, ASP.NET Core denetleyicileri gibi uygulama hizmetleri ile IDbContextFactory<TContext>eklenebilir ve bağlam örneklerinin örneğini başlatmak için bu hizmeti kullanabilir:

public class MyController : Controller
{
    private readonly IDbContextFactory<SomeDbContext> _contextFactory;

    public MyController(IDbContextFactory<SomeDbContext> contextFactory)
        => _contextFactory = contextFactory;

    public void DoSomeThing()
    {
        using (var context = _contextFactory.CreateDbContext())
        {
            // ...
        }
    }
}

Daha fazla bilgi için DbContextFactory ile ilgili tüm belgelere bakın.

SQLite tablosu yeniden derlemeleri

SQLite, diğer veritabanlarına kıyasla şema işleme özelliklerinde nispeten sınırlıdır; örneğin, var olan bir tablodan sütun bırakma desteklenmez. EF Core 5.0, otomatik olarak yeni bir tablo oluşturarak, eski tablodan verileri kopyalayarak, eski tabloyu bırakarak ve yeni tabloyu yeniden adlandırarak bu sınırlamalara geçici bir çözüm sağlar. Bu, tabloyu "yeniden oluşturur" ve daha önce desteklenmeyen geçiş işlemlerinin güvenli bir şekilde uygulanmasını sağlar.

Tablo yeniden derlemeleri aracılığıyla hangi geçiş işlemlerinin desteklendiği hakkında ayrıntılı bilgi için bu belgeler sayfasına bakın.

Veritabanı harmanlamaları

EF Core 5.0, veritabanı, sütun veya sorgu düzeyinde metin harmanlamaları belirtme desteği sağlar. Bu, büyük/küçük harf duyarlılığı ve diğer metinsel özelliklerin hem esnek hem de sorgu performansını tehlikeye atmayacak şekilde yapılandırılmasını sağlar.

Örneğin, aşağıdakiler sütunu SQL Server'da büyük/küçük harfe duyarlı olacak şekilde yapılandıracak Name ve sütunda oluşturulan tüm dizinler buna göre çalışır:

modelBuilder
    .Entity<User>()
    .Property(e => e.Name)
    .UseCollation("SQL_Latin1_General_CP1_CS_AS");

Daha fazla bilgi için harmanlamalar ve büyük/küçük harf duyarlılığı ile ilgili tüm belgelere bakın.

Olay sayaçları

EF Core 5.0, uygulamanızın performansını izlemek ve çeşitli anomalileri tespit etmek için kullanılabilen olay sayaçlarını kullanıma sunar. Dotnet-counters aracıyla EF çalıştıran bir işleme eklemeniz yeterlidir:

> dotnet counters monitor Microsoft.EntityFrameworkCore -p 49496

[Microsoft.EntityFrameworkCore]
    Active DbContexts                                               1
    Execution Strategy Operation Failures (Count / 1 sec)           0
    Execution Strategy Operation Failures (Total)                   0
    Optimistic Concurrency Failures (Count / 1 sec)                 0
    Optimistic Concurrency Failures (Total)                         0
    Queries (Count / 1 sec)                                     1,755
    Queries (Total)                                            98,402
    Query Cache Hit Rate (%)                                      100
    SaveChanges (Count / 1 sec)                                     0
    SaveChanges (Total)                                             1

Daha fazla bilgi için olay sayaçlarıyla ilgili tüm belgelere bakın.

Diğer özellikler

Model oluşturma

  • Değer karşılaştırıcıların daha kolay yapılandırılması için model oluşturma API'leri kullanıma sunulmuştur.
  • Hesaplanan sütunlar artık depolanmış veya sanal olarak yapılandırılabilir.
  • Duyarlık ve ölçek artık Fluent API aracılığıyla yapılandırılabilir.
  • Gezinti özellikleri için yeni model oluşturma API'leri kullanıma sunulmuştur.
  • Özelliklere benzer şekilde alanlar için yeni model oluşturma API'leri kullanıma sunulmuştur.
  • .NET PhysicalAddress ve IPAddress türleri artık veritabanı dizesi sütunlarıyla eşlenebilir.
  • Artık yeni [BackingField] öznitelik aracılığıyla bir yedekleme alanı yapılandırılabilir.
  • Artık boş değer atanabilir yedekleme alanlarına izin verilir ve CLR varsayılanı iyi bir sentinel değeri (dikkate değer bool) olmadığında depo tarafından oluşturulan varsayılanlar için daha iyi destek sağlar.
  • Fluent API'sini kullanmak yerine bir dizin belirtmek için varlık türünde yeni [Index] bir öznitelik kullanılabilir.
  • Bir varlık türünü anahtarsız olarak yapılandırmak için yeni [Keyless] bir öznitelik kullanılabilir.
  • Varsayılan olarak, EF Core artık ayırıcıları eksiksiz olarak görür, yani modelde uygulama tarafından yapılandırılmamış ayrımcı değerleri hiçbir zaman görmeyi beklemez. Bu, bazı performans iyileştirmelerine olanak tanır ve ayrıştırıcı sütununuz bilinmeyen değerler barındırıyorsa devre dışı bırakılabilir.

Sorgu

  • Sorgu çevirisi hatası özel durumları artık sorunun tespitine yardımcı olmak için hatanın nedenleri hakkında daha açık nedenler içeriyor.
  • İzlemesiz sorgular artık kimlik çözümlemesi gerçekleştirebilir ve aynı veritabanı nesnesi için birden çok varlık örneğinin döndürülmesini önleyebilir.
  • GroupBy için koşullu toplamalar (örneğin) GroupBy(o => o.OrderDate).Select(g => g.Count(i => i.OrderDate != null))desteği eklendi.
  • Toplamadan önce Distinct işlecini grup öğelerine çevirme desteği eklendi.
  • çevirisi Reverse.
  • SQL Server için geliştirilmiş DateTime çeviri (ör. DateDiffWeek, DateFromParts).
  • Bayt dizilerindeki yeni yöntemlerin çevirisi (örn. Contains, , LengthSequenceEqual).
  • İkinin tamamlayıcısı gibi bazı ek bit düzeyinde işleçlerin çevirisi.
  • Dizeler FirstOrDefault üzerinden çevirisi.
  • Null semantiğin çevresinde geliştirilmiş sorgu çevirisi, daha sıkı ve daha verimli sorgulara neden oldu.
  • Kullanıcı eşlemeli işlevler artık null yayma durumunu denetlemek için ek açıklama ekleyebilir ve bu da daha sıkı ve daha verimli sorgulara neden olabilir.
  • CASE blokları içeren SQL artık çok daha kısadır.
  • SQL Server DATALENGTH işlevi artık sorgularda yeni EF.Functions.DataLength yöntemle çağrılabilir.
  • EnableDetailedErrorsözel durumlara ek ayrıntılar ekler.

Tasarruf

  • SaveChanges kesme noktası ve olayları.
  • İşlem kayıt noktalarını denetlemek için API'ler kullanıma sunulmuştur. Buna ek olarak, EF Core çağrıldığında ve bir işlem zaten devam ederken SaveChanges otomatik olarak bir kaydetme noktası oluşturur ve hata durumunda buna geri döner.
  • İşlem kimliği uygulama tarafından açıkça ayarlanabilir ve günlükte ve başka bir yerde işlem olaylarının daha kolay ilişkilendirilmesine olanak sağlar.
  • SQL Server için varsayılan en büyük toplu iş boyutu, toplu işlem performansı analizine göre 42 olarak değiştirildi.

Geçişler ve iskele oluşturma

  • Tablolar artık geçişlerin dışında tutulabilir.
  • Yeni dotnet ef migrations list bir komut şimdi veritabanına henüz hangi geçişlerin uygulanmadığını gösterir (Get-Migration Paket Yönetimi Konsolu'nda da aynı işlemi yapar).
  • Geçiş betikleri artık geçiş uygulamasının başarısız olduğu işleme durumlarını iyileştirmek için uygun olduğunda işlem deyimleri içeriyor.
  • Eşlenmemiş temel sınıfların sütunları artık eşlenen varlık türleri için diğer sütunlarda sıralandı. Bunun yalnızca yeni oluşturulan tabloları etkilediğini unutmayın; mevcut tabloların sütun sırası değişmeden kalır.
  • Geçiş oluşturma artık oluşturulan geçişin bir kez etkili olup olmadığını ve çıkışın hemen yürütüleceğini veya betik olarak oluşturulup oluşturulmayacağını fark edebilir.
  • Geçişler ve iskelede ad alanlarını belirtmek için yeni komut satırı parametreleri eklendi.
  • dotnet ef database update komutu artık bağlantı dizesi belirtmek için yeni --connection bir parametre kabul ediyor.
  • Mevcut veritabanlarının iskelesi artık tablo adlarını tekilleştirir, bu nedenle ve Addresses adlı People tablolar ve Addressadlı Person varlık türlerine iskelelenir. Özgün veritabanı adları yine de korunabilir.
  • Yeni --no-onconfiguring seçenek, EF Core'a modelin iskelesini oluştururken dışlama OnConfiguring talimatı verebilir.

Azure Cosmos DB

Sqlite

  • Hesaplanan sütunlar artık destekleniyor.
  • GetBytes, GetChars ve GetTextReader ile ikili ve dize verilerini almak artık SqliteBlob ve akışlardan yararlanarak daha verimlidir.
  • SqliteConnection'ın başlatılması artık yavaş.

Diğer

  • INotifyPropertyChanging ve INotifyPropertyChanged'i otomatik olarak uygulayan değişiklik izleme proxy'leri oluşturulabilir. Bu, çağrıldığında SaveChanges değişiklikleri taramayan değişiklik izleme için alternatif bir yaklaşım sağlar.
  • Bir DbConnection veya bağlantı dizesi artık zaten başlatılmış bir DbContext üzerinde değiştirilebilir.
  • Yeni ChangeTracker.Clear yöntem, izlenen tüm varlıkların DbContext'ini temizler. Bu genellikle her çalışma birimi için yeni, kısa süreli bir bağlam örneği oluşturmanın en iyi yöntemi kullanılırken gerekli olmamalıdır. Ancak, bir DbContext örneğinin durumunu sıfırlamanız gerekiyorsa, yeni Clear() yöntemi kullanmak tüm varlıkları toplu olarak ayırmaktan daha verimli ve sağlamdır.
  • EF Core komut satırı araçları artık veDOTNET_ENVIRONMENT ortam değişkenlerini otomatik olarak "Geliştirme" olarak yapılandırıyorASPNETCORE_ENVIRONMENT. Bu, genel konağı geliştirme sırasında ASP.NET Core deneyimine uygun olarak kullanırken deneyimi getirir.
  • Özel komut satırı bağımsız değişkenleri içine IDesignTimeDbContextFactory<TContext>akışla aktarılabilir ve uygulamaların bağlamın nasıl oluşturulduğunu ve başlatıldığını denetlemesine olanak tanır.
  • Dizin doldurma faktörü artık SQL Server'da yapılandırılabilir.
  • Yeni IsRelational özellik, ilişkisel sağlayıcı ve ilişkisel olmayan bir sağlayıcı (bellek içi gibi) kullanılırken ayırt etmek için kullanılabilir.