Aracılığıyla paylaş


Entity Framework Core Blazor ile ASP.NET Core (EF Core)

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Bu makalede, sunucu tarafı EF Core uygulamalarda Entity Framework Core'un ()Blazoraçıklanmaktadır.

Sunucu tarafı Blazor durum bilgisi olan bir uygulama çerçevesidir. Uygulama sunucuyla devam eden bir bağlantı tutar ve kullanıcının durumu sunucunun belleğinde bir bağlantı hattında tutulur. Kullanıcı durumunun bir örneği, bağlantı hattı kapsamındaki bağımlılık ekleme (DI) hizmet örneklerinde tutulan verilerdir. Sağlayan benzersiz uygulama modeli Blazor , Entity Framework Core kullanmak için özel bir yaklaşım gerektirir.

Not

Bu makale, sunucu tarafı EF Core uygulamalarında ele alırBlazor. Blazor WebAssembly uygulamalar, çoğu doğrudan veritabanı bağlantısını engelleyen bir WebAssembly korumalı alanında çalışır. içinde EF Core çalıştırmak Blazor WebAssembly bu makalenin kapsamının dışındadır.

Bu kılavuz, içinde Blazor Web Appetkileşimli sunucu tarafı işlemeyi (etkileşimli SSR) benimseyen bileşenler için geçerlidir.

Bu kılavuz barındırılan Server bir çözümün Blazor WebAssembly veya Blazor Server uygulamanın projesi için geçerlidir.

Üretim uygulamaları için güvenli kimlik doğrulama akışı gerekiyor

Bu makale, kullanıcı kimlik doğrulaması gerektirmeyen bir yerel veritabanı kullanımıyla ilgili. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Dağıtılan test ve üretim Blazor uygulamaları için kimlik doğrulaması hakkında daha fazla bilgi için Güvenlik veBlazordüğümIdentitybakın.

Microsoft Azure hizmetleri için yönetilen kimlikleri kullanmanızı öneririz. Yönetilen kimlikler, kimlik bilgilerini uygulama kodunda depolamadan Azure hizmetlerinde güvenli bir şekilde kimlik doğrulaması yapar. Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

Blazor Film veritabanı uygulaması oluşturma öğreticisi

Veritabanı işlemleri için kullanan bir uygulama oluşturma öğretici deneyimi için bkz. film veritabanı uygulaması derleme (Genel Bakış) . Öğreticide, bir film veritabanında filmleri görüntüleyebilen ve yönetebilen bir oluşturma Blazor Web App gösterilmektedir.

Veritabanı erişimi

EF Core DbContext, veritabanı erişimini yapılandırmanın ve bir iş birimi olarak davranmanın bir aracı olarak çalışır. EF Corebağlamı AddDbContext kapsamlı bir hizmet olarak kaydeden ASP.NET Core uygulamaları için uzantıyı sağlar. Sunucu tarafı Blazor uygulamalarda, kapsamlı hizmet kayıtları sorunlu olabilir çünkü örnek kullanıcının bağlantı hattındaki bileşenler arasında paylaşılır. DbContext iş parçacığı güvenli değildir ve eşzamanlı kullanım için tasarlanmamıştır. Mevcut yaşam süreleri şu nedenlerle uygun değil:

  • Singleton , uygulamanın tüm kullanıcıları arasında durumu paylaşır ve uygunsuz eşzamanlı kullanıma yol açar.
  • Kapsamı belirlenmiş (varsayılan), aynı kullanıcı için bileşenler arasında benzer bir sorun oluşturur.
  • Geçici olarak istek başına yeni bir örnek elde edilebilir, ancak bileşenler uzun ömürlü olabileceği için bu, hedeflenenden daha uzun süreli bir bağlamla sonuçlanır.

Aşağıdaki öneriler, sunucu tarafı EF Core uygulamalarda kullanmaya Blazor yönelik tutarlı bir yaklaşım sağlamak üzere tasarlanmıştır.

  • İşlem başına bir bağlam kullanmayı göz önünde bulundurun. Bağlam hızlı ve düşük ek yük örnekleme için tasarlanmıştır:

    using var context = new ProductsDatabaseContext();
    
    return await context.Products.ToListAsync();
    
  • Birden çok eşzamanlı işlemi önlemek için bir bayrak kullanın:

    if (Loading)
    {
        return;
    }
    
    try
    {
        Loading = true;
    
        ...
    }
    finally
    {
        Loading = false;
    }
    

    Veritabanı işlemlerini try bloğundaki Loading = true; satırının arkasına yerleştirin.

    İş parçacığı güvenliği önemli değildir, bu nedenle mantığın yüklenmesi için veritabanı kayıtlarının kilitlenmesi gerekmez. Yükleme mantığı kullanıcı arabirimi denetimlerini devre dışı bırakmak için kullanılır, böylece kullanıcılar yanlışlıkla düğmeler seçmez veya veriler getirilirken alanları güncelleştirmez.

  • Birden çok iş parçacığının aynı kod bloğuna erişme olasılığı varsa, bir fabrika ekleyin ve işlem başına yeni bir örnek oluşturun. Aksi takdirde, bağlamı eklemek ve kullanmak genellikle yeterlidir.

  • 'nin EF Core veya eşzamanlılık denetiminden yararlanan daha uzun süreli işlemler için, bağlamı bileşenin kullanım ömrüyle kapsamına alın.

Yeni DbContext örnekler

Yeni DbContext örnek oluşturmanın en hızlı yolu, kullanarak yeni bir örnek oluşturmaktır new . Ancak, ek bağımlılıkların çözülmesini gerektiren senaryolar vardır:

Uyarı

Uygulama gizli dizilerini, bağlantı dizesi'leri, kimlik bilgilerini, parolaları, kişisel kimlik numaralarını (PIN'ler), özel C#/.NET kodunu veya özel anahtarları/belirteçleri her zaman güvenli olmayan istemci tarafı kodunda depolamayın. Test/hazırlama ve üretim ortamlarında, sunucu tarafı Blazor kod ve web API'leri, proje kodu veya yapılandırma dosyalarında kimlik bilgilerinin korunmasını önleyen güvenli kimlik doğrulama akışları kullanmalıdır. Yerel geliştirme testlerinin dışında, ortam değişkenleri en güvenli yaklaşım olmadığından hassas verileri depolamak için ortam değişkenlerinin kullanılmasından kaçınmanızı öneririz. Yerel geliştirme testinde gizli verilerin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracı önerilir. Daha fazla bilgi için bkz . Hassas verileri ve kimlik bilgilerini güvenli bir şekilde koruma.

Bağımlılıklarla yeni DbContext bir oluşturmanın önerilen yaklaşımı bir fabrika kullanmaktır. EF Core 5.0 veya üzeri, yeni bağlamlar oluşturmak için yerleşik bir fabrika sağlar.

.NET'in 5.0 öncesi sürümlerinde aşağıdaki DbContextFactorykullanın:

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

namespace BlazorServerDbContextExample.Data
{
    public class DbContextFactory<TContext> 
        : IDbContextFactory<TContext> where TContext : DbContext
    {
        private readonly IServiceProvider provider;

        public DbContextFactory(IServiceProvider provider)
        {
            this.provider = provider ?? throw new ArgumentNullException(
                $"{nameof(provider)}: You must configure an instance of " +
                "IServiceProvider");
        }

        public TContext CreateDbContext() => 
            ActivatorUtilities.CreateInstance<TContext>(provider);
    }
}

Önceki fabrikada:

Aşağıdaki örnek, SQLite'i yapılandırır ve kişileri yöneten bir uygulamada veri günlüğü kaydını etkinleştirir. Kod, veritabanı fabrikasını DI için yapılandırmak ve varsayılan seçenekleri sağlamak için bir uzantı yöntemi (AddDbContextFactory) kullanır:

builder.Services.AddDbContextFactory<ContactContext>(opt =>
    opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
services.AddDbContextFactory<ContactContext>(opt =>
    opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));

Fabrika, yeni DbContext örnekleri oluşturmak için bileşenlere eklenir.

Veritabanı bağlamı kapsamını bir bileşen yöntemiyle kapsama

Fabrika bileşene eklenir:

@inject IDbContextFactory<ContactContext> DbFactory

Fabrikayı kullanarak bir yöntem için DbContext oluşturma (DbFactory):

private async Task DeleteContactAsync()
{
    using var context = DbFactory.CreateDbContext();

    if (context.Contacts is not null)
    {
        var contact = await context.Contacts.FirstAsync(...);

        if (contact is not null)
        {
            context.Contacts?.Remove(contact);
            await context.SaveChangesAsync();
        }
    }
}

Veritabanı bağlamının kapsamını bileşenin kullanım ömrüne göre belirleme

Bir bileşenin ömrü boyunca var olan bir oluşturmak DbContext isteyebilirsiniz. Bu, bunu bir birimi olarak kullanmanıza ve değişiklik izleme ve eşzamanlılık çözümlemesi gibi yerleşik özelliklerden yararlanmanıza olanak tanır.

IDisposable uygulayın ve fabrikayı bileşene enjekte edin.

@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory

DbContextiçin bir özellik oluşturun:

private ContactContext? Context { get; set; }

DbContextoluşturmak için OnInitializedAsync geçersiz kılınmış:

protected override async Task OnInitializedAsync()
{
    Context = DbFactory.CreateDbContext();
}

bileşen atıldığında DbContext atılır:

public void Dispose() => Context?.Dispose();

Hassas veri günlüğünü etkinleştirme

EnableSensitiveDataLogging özel durum iletilerine ve çerçeve günlüğüne uygulama verilerini içerir. Günlüğe kaydedilen veriler, varlık örneklerinin özelliklerine atanan değerleri ve veritabanına gönderilen komutlar için parametre değerlerini içerebilir. Veritabanında yürütülen SQL deyimlerini günlüğe kaydederken parolaları ve diğer EnableSensitiveDataLogging kullanıma sunma ihtimalinden, ile verilerin günlüğe kaydedilmesi bir güvenlik riskidir.

Yalnızca geliştirme ve test için etkinleştirmenizi EnableSensitiveDataLogging öneririz:

#if DEBUG
    services.AddDbContextFactory<ContactContext>(opt =>
        opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db")
        .EnableSensitiveDataLogging());
#else
    services.AddDbContextFactory<ContactContext>(opt =>
        opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
#endif

Ek kaynaklar