ASP.NET Core Blazor Server Entity Framework Core (EFCore) ile
Blazor Server durum bilgisi olan bir uygulama çerçevesidir. Uygulama, sunucuyla devam eden bir bağlantı sağlar ve kullanıcının durumu bir devrendeki sunucunun belleğinde tutulur. Kullanıcı durumunun bir örneği, devre kapsamına alınan bağımlılık ekleme (dı) hizmet örneklerinde tutulan veri. Tarafından sağlanan benzersiz uygulama modeli Blazor Server Entity Framework Core kullanmak için özel bir yaklaşım gerektirir.
Not
Bu makalede, uygulamalarda EF Core ele alınmaktadır Blazor Server . Blazor WebAssembly uygulamalar, çoğu doğrudan veritabanı bağlantısının önlediği bir WebAssembly korumalı alanında çalışır. İçinde EF Core çalıştırmak, Blazor WebAssembly Bu makalenin kapsamı dışındadır.
Örnek uygulama
Örnek uygulama, EF Core kullanan uygulamalar için bir başvuru olarak oluşturulmuştur Blazor Server . Örnek uygulama sıralama ve filtreleme, silme, ekleme ve güncelleştirme işlemlerini içeren bir kılavuz içerir. Örnek, iyimser eşzamanlılık işlemek için EF Core kullanımını gösterir.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Örnek, herhangi bir platformda kullanılabilmesi için yerel bir SQLite veritabanı kullanır. örnek ayrıca, oluşturulan SQL sorguları göstermek için veritabanı günlüğünü de yapılandırır. Bu, içinde yapılandırılır appsettings.Development.json :
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
}
}
Izgara, ekleme ve görüntüleme bileşenleri, her işlem için bir bağlamın oluşturulduğu "işlem başına bağlam" modelini kullanır. Düzenleme bileşeni, her bileşen için bir bağlamın oluşturulduğu "bileşen başına bağlam" modelini kullanır.
Not
Bu konudaki bazı kod örnekleri, gösterilmeyen ad alanlarını ve Hizmetleri gerektirir. Gerekli ve örnek yönergeleri dahil olmak üzere tam çalışma kodunu incelemek için @using @inject Razor bkz. örnek uygulama.
Veritabanı erişimi
EF Core DbContext , veritabanı erişimini yapılandırma ve bir iş birimigörevi gören bir yöntem olarak bir kullanır. EF Core AddDbContext , bağlamı varsayılan olarak kapsamlı bir hizmet olarak kaydeden ASP.NET Core uygulamalar için uzantı sağlar. Blazor ServerUygulamalarda, örnek Kullanıcı devresi içindeki bileşenler arasında paylaşıldığından kapsamlı hizmet kayıtları sorunlu olabilir. 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ğildir:
- Tek tek , uygulamanın tüm kullanıcıları genelinde durumu paylaşır ve uygunsuz eşzamanlı kullanım sağlar.
- Kapsamlı (varsayılan), aynı kullanıcının bileşenleri arasında benzer bir sorun oluşturur.
- İstek başına yeni bir örneğe geçici sonuçlar; Ancak, bileşenler uzun süreli olabileceğinden, bu, amacına kıyasla daha uzun ömürlü bir bağlam elde edebilir.
Aşağıdaki öneriler, uygulamalarda EF Core kullanmak için tutarlı bir yaklaşım sağlamak üzere tasarlanmıştır Blazor Server .
Varsayılan olarak, işlem başına bir bağlam kullanmayı düşünün. Bağlam hızlı, düşük yük örneği oluşturma için tasarlanmıştır:
using var context = new MyContext(); return await context.MyEntities.ToListAsync();Birden çok eş zamanlı işlemi engellemek için bayrak kullanın:
if (Loading) { return; } try { Loading = true; ... } finally { Loading = false; }Loading = true;Blok içindeki satırdan sonra işlemleri yerleştirtry.EF Core değişiklik izleme veya eşzamanlılık denetimindenfaydalanan uzun süreli işlemler için, bağlamı bileşenin kullanım ömrüne göre kapsam.
Yeni DbContext örnekleri
Yeni bir örnek oluşturmanın en hızlı yolu DbContext , new Yeni bir örnek oluşturmak için kullanmaktır. Ancak, ek bağımlılıkların çözümlenme gerektirebilecek birkaç senaryo vardır. Örneğin, DbContextOptions bağlamını yapılandırmak için kullanmak isteyebilirsiniz.
Bağımlılıklar ile yeni bir oluşturma için önerilen çözüm, DbContext bir fabrika kullanmaktır. EF Core 5,0 veya üzeri, yeni bağlamlar oluşturmaya yönelik yerleşik bir fabrika sağlar.
Aşağıdaki örnekte, SQLite yapılandırılır ve veri günlüğü etkinleştirilir. Kod, AddDbContextFactory dı için veritabanı fabrikasını yapılandırmak ve varsayılan seçenekleri sağlamak için bir genişletme yöntemi () kullanır:
builder.Services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
Fabrika bileşenlere eklenir ve yeni örnekler oluşturmak için kullanılır. Örneğin, içinde Pages/Index.razor :
private async Task DeleteContactAsync()
{
using var context = DbFactory.CreateDbContext();
Filters.Loading = true;
if (Wrapper is not null)
{
var contact = await context.Contacts?
.FirstAsync(c => c.Id == Wrapper.DeleteRequestId);
if (contact != null)
{
context.Contacts?.Remove(contact);
await context.SaveChangesAsync();
}
}
Filters.Loading = false;
await ReloadAsync();
}
Not
Wrapper bileşene bir bileşen başvurusu GridWrapper . Index Pages/Index.razor Örnek uygulamadakibileşene () bakın.
yeni DbContext örnekler DbContext , ASP.NET Core Identity modelinikullanırken olduğu gibi, her bir bağlantı dizesini yapılandırmanıza olanak tanıyan bir fabrika ile oluşturulabilir. Daha fazla bilgi için bkz. Blazor Server uygulamalarda EF Core ile çok kiracılı.
Bileşen ömrü için kapsam
DbContextBir bileşenin ömrü için var olan bir oluşturmak isteyebilirsiniz. Bu, bunu çalışma birimi olarak kullanmanıza ve değişiklik izleme ve eşzamanlılık çözümleme gibi yerleşik özelliklerden yararlanmanıza olanak sağlar.
Fabrika 'yi kullanarak bir bağlam oluşturabilir ve bileşenin kullanım ömrü boyunca izleyebilirsiniz. İlk olarak, IDisposable fabrika 'yi aşağıda gösterildiği gibi uygulayın ve ekleme Pages/EditContact.razor :
@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory
Örnek uygulama, bileşen bırakıldığında bağlamın elden çıkarılmasını sağlar:
public void Dispose()
{
Context?.Dispose();
}
Son olarak, OnInitializedAsync Yeni bağlam oluşturmak için geçersiz kılınır. Örnek uygulamada, OnInitializedAsync kişiyi aynı yönteme yükler:
protected override async Task OnInitializedAsync()
{
Busy = true;
try
{
Context = DbFactory.CreateDbContext();
if (Context is not null && Context.Contacts is not null)
{
var contact = await Context.Contacts.SingleOrDefaultAsync(c => c.Id == ContactId);
if (contact is not null)
{
Contact = contact;
}
}
}
finally
{
Busy = false;
}
await base.OnInitializedAsync();
}
Hassas verileri günlüğe kaydetmeyi etkinleştir
EnableSensitiveDataLogging özel durum iletileri ve çerçeve günlüğe kaydetme içindeki uygulama verilerini içerir. Günlüğe kaydedilen veriler, varlık örneklerinin özelliklerine atanan değerleri ve veritabanına gönderilen komutlara yönelik parametre değerlerini içerebilir. verileri günlüğe kaydetme EnableSensitiveDataLogging , veritabanına karşı yürütülen SQL deyimlerini günlüğe kaydederken parolaları ve diğer kişisel bilgileri (pıı) açığa çıkarabilecek bir güvenlik riskidir.
Yalnızca EnableSensitiveDataLogging geliştirme ve test için etkinleştirme yapmanızı ö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
Blazor Server durum bilgisi olan bir uygulama çerçevesidir. Uygulama, sunucuyla devam eden bir bağlantı sağlar ve kullanıcının durumu bir devrendeki sunucunun belleğinde tutulur. Kullanıcı durumunun bir örneği, devre kapsamına alınan bağımlılık ekleme (dı) hizmet örneklerinde tutulan veri. Tarafından sağlanan benzersiz uygulama modeli Blazor Server Entity Framework Core kullanmak için özel bir yaklaşım gerektirir.
Not
Bu makalede, uygulamalarda EF Core ele alınmaktadır Blazor Server . Blazor WebAssembly uygulamalar, çoğu doğrudan veritabanı bağlantısının önlediği bir WebAssembly korumalı alanında çalışır. İçinde EF Core çalıştırmak, Blazor WebAssembly Bu makalenin kapsamı dışındadır.
Örnek uygulama
Örnek uygulama, EF Core kullanan uygulamalar için bir başvuru olarak oluşturulmuştur Blazor Server . Örnek uygulama sıralama ve filtreleme, silme, ekleme ve güncelleştirme işlemlerini içeren bir kılavuz içerir. Örnek, iyimser eşzamanlılık işlemek için EF Core kullanımını gösterir.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Örnek, herhangi bir platformda kullanılabilmesi için yerel bir SQLite veritabanı kullanır. örnek ayrıca, oluşturulan SQL sorguları göstermek için veritabanı günlüğünü de yapılandırır. Bu, içinde yapılandırılır appsettings.Development.json :
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
}
}
Izgara, ekleme ve görüntüleme bileşenleri, her işlem için bir bağlamın oluşturulduğu "işlem başına bağlam" modelini kullanır. Düzenleme bileşeni, her bileşen için bir bağlamın oluşturulduğu "bileşen başına bağlam" modelini kullanır.
Not
Bu konudaki bazı kod örnekleri, gösterilmeyen ad alanlarını ve Hizmetleri gerektirir. Gerekli ve örnek yönergeleri dahil olmak üzere tam çalışma kodunu incelemek için @using @inject Razor bkz. örnek uygulama.
Veritabanı erişimi
EF Core DbContext , veritabanı erişimini yapılandırma ve bir iş birimigörevi gören bir yöntem olarak bir kullanır. EF Core AddDbContext , bağlamı varsayılan olarak kapsamlı bir hizmet olarak kaydeden ASP.NET Core uygulamalar için uzantı sağlar. Blazor ServerUygulamalarda, örnek Kullanıcı devresi içindeki bileşenler arasında paylaşıldığından kapsamlı hizmet kayıtları sorunlu olabilir. 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ğildir:
- Tek tek , uygulamanın tüm kullanıcıları genelinde durumu paylaşır ve uygunsuz eşzamanlı kullanım sağlar.
- Kapsamlı (varsayılan), aynı kullanıcının bileşenleri arasında benzer bir sorun oluşturur.
- İstek başına yeni bir örneğe geçici sonuçlar; Ancak, bileşenler uzun süreli olabileceğinden, bu, amacına kıyasla daha uzun ömürlü bir bağlam elde edebilir.
Aşağıdaki öneriler, uygulamalarda EF Core kullanmak için tutarlı bir yaklaşım sağlamak üzere tasarlanmıştır Blazor Server .
Varsayılan olarak, işlem başına bir bağlam kullanmayı düşünün. Bağlam hızlı, düşük yük örneği oluşturma için tasarlanmıştır:
using var context = new MyContext(); return await context.MyEntities.ToListAsync();Birden çok eş zamanlı işlemi engellemek için bayrak kullanın:
if (Loading) { return; } try { Loading = true; ... } finally { Loading = false; }Loading = true;Blok içindeki satırdan sonra işlemleri yerleştirtry.EF Core değişiklik izleme veya eşzamanlılık denetimindenfaydalanan uzun süreli işlemler için, bağlamı bileşenin kullanım ömrüne göre kapsam.
Yeni DbContext örnekleri
Yeni bir örnek oluşturmanın en hızlı yolu DbContext , new Yeni bir örnek oluşturmak için kullanmaktır. Ancak, ek bağımlılıkların çözümlenme gerektirebilecek birkaç senaryo vardır. Örneğin, DbContextOptions bağlamını yapılandırmak için kullanmak isteyebilirsiniz.
Bağımlılıklar ile yeni bir oluşturma için önerilen çözüm, DbContext bir fabrika kullanmaktır. EF Core 5,0 veya üzeri, yeni bağlamlar oluşturmaya yönelik yerleşik bir fabrika sağlar.
Aşağıdaki örnekte, SQLite yapılandırılır ve veri günlüğü etkinleştirilir. Kod, AddDbContextFactory dı için veritabanı fabrikasını yapılandırmak ve varsayılan seçenekleri sağlamak için bir genişletme yöntemi () kullanır:
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
Fabrika bileşenlere eklenir ve yeni örnekler oluşturmak için kullanılır. Örneğin, içinde Pages/Index.razor :
private async Task DeleteContactAsync()
{
using var context = DbFactory.CreateDbContext();
Filters.Loading = true;
var contact = await context.Contacts.FirstAsync(
c => c.Id == Wrapper.DeleteRequestId);
if (contact != null)
{
context.Contacts.Remove(contact);
await context.SaveChangesAsync();
}
Filters.Loading = false;
await ReloadAsync();
}
Not
Wrapper bileşene bir bileşen başvurusu GridWrapper . Index Pages/Index.razor Örnek uygulamadakibileşene () bakın.
yeni DbContext örnekler DbContext , ASP.NET Core Identity modelinikullanırken olduğu gibi, her bir bağlantı dizesini yapılandırmanıza olanak tanıyan bir fabrika ile oluşturulabilir. Daha fazla bilgi için bkz. Blazor Server uygulamalarda EF Core ile çok kiracılı.
Bileşen ömrü için kapsam
DbContextBir bileşenin ömrü için var olan bir oluşturmak isteyebilirsiniz. Bu, bunu çalışma birimi olarak kullanmanıza ve değişiklik izleme ve eşzamanlılık çözümleme gibi yerleşik özelliklerden yararlanmanıza olanak sağlar.
Fabrika 'yi kullanarak bir bağlam oluşturabilir ve bileşenin kullanım ömrü boyunca izleyebilirsiniz. İlk olarak, IDisposable fabrika 'yi aşağıda gösterildiği gibi uygulayın ve ekleme Pages/EditContact.razor :
@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory
Örnek uygulama, bileşen bırakıldığında bağlamın elden çıkarılmasını sağlar:
public void Dispose()
{
Context?.Dispose();
}
Son olarak, OnInitializedAsync Yeni bağlam oluşturmak için geçersiz kılınır. Örnek uygulamada, OnInitializedAsync kişiyi aynı yönteme yükler:
protected override async Task OnInitializedAsync()
{
Busy = true;
try
{
Context = DbFactory.CreateDbContext();
Contact = await Context.Contacts
.SingleOrDefaultAsync(c => c.Id == ContactId);
}
finally
{
Busy = false;
}
await base.OnInitializedAsync();
}
Hassas verileri günlüğe kaydetmeyi etkinleştir
EnableSensitiveDataLogging özel durum iletileri ve çerçeve günlüğe kaydetme içindeki uygulama verilerini içerir. Günlüğe kaydedilen veriler, varlık örneklerinin özelliklerine atanan değerleri ve veritabanına gönderilen komutlara yönelik parametre değerlerini içerebilir. verileri günlüğe kaydetme EnableSensitiveDataLogging , veritabanına karşı yürütülen SQL deyimlerini günlüğe kaydederken parolaları ve diğer kişisel bilgileri (pıı) açığa çıkarabilecek bir güvenlik riskidir.
Yalnızca EnableSensitiveDataLogging geliştirme ve test için etkinleştirme yapmanızı ö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
Blazor Server durum bilgisi olan bir uygulama çerçevesidir. Uygulama, sunucuyla devam eden bir bağlantı sağlar ve kullanıcının durumu bir devrendeki sunucunun belleğinde tutulur. Kullanıcı durumunun bir örneği, devre kapsamına alınan bağımlılık ekleme (dı) hizmet örneklerinde tutulan veri. Tarafından sağlanan benzersiz uygulama modeli Blazor Server Entity Framework Core kullanmak için özel bir yaklaşım gerektirir.
Not
Bu makalede, uygulamalarda EF Core ele alınmaktadır Blazor Server . Blazor WebAssembly uygulamalar, çoğu doğrudan veritabanı bağlantısının önlediği bir WebAssembly korumalı alanında çalışır. İçinde EF Core çalıştırmak, Blazor WebAssembly Bu makalenin kapsamı dışındadır.
Örnek uygulama
Örnek uygulama, EF Core kullanan uygulamalar için bir başvuru olarak oluşturulmuştur Blazor Server . Örnek uygulama sıralama ve filtreleme, silme, ekleme ve güncelleştirme işlemlerini içeren bir kılavuz içerir. Örnek, iyimser eşzamanlılık işlemek için EF Core kullanımını gösterir.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Örnek, herhangi bir platformda kullanılabilmesi için yerel bir SQLite veritabanı kullanır. örnek ayrıca, oluşturulan SQL sorguları göstermek için veritabanı günlüğünü de yapılandırır. Bu, içinde yapılandırılır appsettings.Development.json :
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore.Database.Command": "Information"
}
}
}
Izgara, ekleme ve görüntüleme bileşenleri, her işlem için bir bağlamın oluşturulduğu "işlem başına bağlam" modelini kullanır. Düzenleme bileşeni, her bileşen için bir bağlamın oluşturulduğu "bileşen başına bağlam" modelini kullanır.
Not
Bu konudaki bazı kod örnekleri, gösterilmeyen ad alanlarını ve Hizmetleri gerektirir. Gerekli ve örnek yönergeleri dahil olmak üzere tam çalışma kodunu incelemek için @using @inject Razor bkz. örnek uygulama.
Veritabanı erişimi
EF Core DbContext , veritabanı erişimini yapılandırma ve bir iş birimigörevi gören bir yöntem olarak bir kullanır. EF Core AddDbContext , bağlamı varsayılan olarak kapsamlı bir hizmet olarak kaydeden ASP.NET Core uygulamalar için uzantı sağlar. Blazor ServerUygulamalarda, örnek Kullanıcı devresi içindeki bileşenler arasında paylaşıldığından bu sorun sorunlu olabilir. 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ğildir:
- Tek tek , uygulamanın tüm kullanıcıları genelinde durumu paylaşır ve uygunsuz eşzamanlı kullanım sağlar.
- Kapsamlı (varsayılan), aynı kullanıcının bileşenleri arasında benzer bir sorun oluşturur.
- İstek başına yeni bir örneğe geçici sonuçlar; Ancak, bileşenler uzun süreli olabileceğinden, bu, amacına kıyasla daha uzun ömürlü bir bağlam elde edebilir.
Aşağıdaki öneriler, uygulamalarda EF Core kullanmak için tutarlı bir yaklaşım sağlamak üzere tasarlanmıştır Blazor Server .
Varsayılan olarak, işlem başına bir bağlam kullanmayı düşünün. Bağlam hızlı, düşük yük örneği oluşturma için tasarlanmıştır:
using var context = new MyContext(); return await context.MyEntities.ToListAsync();Birden çok eş zamanlı işlemi engellemek için bayrak kullanın:
if (Loading) { return; } try { Loading = true; ... } finally { Loading = false; }Loading = true;Blok içindeki satırdan sonra işlemleri yerleştirtry.EF Core değişiklik izleme veya eşzamanlılık denetimindenfaydalanan uzun süreli işlemler için, bağlamı bileşenin kullanım ömrüne göre kapsam.
Yeni DbContext örnekleri
Yeni bir örnek oluşturmanın en hızlı yolu DbContext , new Yeni bir örnek oluşturmak için kullanmaktır. Ancak, ek bağımlılıkların çözümlenme gerektirebilecek birkaç senaryo vardır. Örneğin, DbContextOptions bağlamını yapılandırmak için kullanmak isteyebilirsiniz.
Bağımlılıklar ile yeni bir oluşturma için önerilen çözüm, DbContext bir fabrika kullanmaktır. Örnek uygulama, içinde kendi fabrikasını uygular Data/DbContextFactory.cs .
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:
- ActivatorUtilities.CreateInstance hizmet sağlayıcı aracılığıyla herhangi bir bağımlılığı karşılar.
IDbContextFactoryEF Core ASP.NET Core 5,0 veya sonraki sürümlerde kullanılabilir. bu nedenle arabirim, ASP.NET Core 3. x için örnek uygulamada uygulanır.
Aşağıdaki örnekte, SQLite yapılandırılır ve veri günlüğü etkinleştirilir. Kod, dı için veritabanı fabrikası yapılandırmak ve varsayılan seçenekleri sağlamak için bir genişletme yöntemi kullanır:
services.AddDbContextFactory<ContactContext>(opt =>
opt.UseSqlite($"Data Source={nameof(ContactContext.ContactsDb)}.db"));
Fabrika bileşenlere eklenir ve yeni örnekler oluşturmak için kullanılır. Örneğin, içinde Pages/Index.razor :
private async Task DeleteContactAsync()
{
using var context = DbFactory.CreateDbContext();
Filters.Loading = true;
var contact = await context.Contacts.FirstAsync(
c => c.Id == Wrapper.DeleteRequestId);
if (contact != null)
{
context.Contacts.Remove(contact);
await context.SaveChangesAsync();
}
Filters.Loading = false;
await ReloadAsync();
}
Not
Wrapper bileşene bir bileşen başvurusu GridWrapper . Index Pages/Index.razor Örnek uygulamadakibileşene () bakın.
yeni DbContext örnekler DbContext , [ASP.NET Core Identity model] (xref: güvenlik/kimlik doğrulama/customize_identity_model) ' i kullanırken olduğu gibi, her bir bağlantı dizesini yapılandırmanıza olanak tanıyan bir fabrika ile oluşturulabilir. Daha fazla bilgi için bkz. Blazor Server uygulamalarda EF Core ile çok kiracılı.
Bileşen ömrü için kapsam
DbContextBir bileşenin ömrü için var olan bir oluşturmak isteyebilirsiniz. Bu, bunu çalışma birimi olarak kullanmanıza ve değişiklik izleme ve eşzamanlılık çözümleme gibi yerleşik özelliklerden yararlanmanıza olanak sağlar.
Fabrika 'yi kullanarak bir bağlam oluşturabilir ve bileşenin kullanım ömrü boyunca izleyebilirsiniz. İlk olarak, IDisposable fabrika 'yi aşağıda gösterildiği gibi uygulayın ve ekleme Pages/EditContact.razor :
@implements IDisposable
@inject IDbContextFactory<ContactContext> DbFactory
Örnek uygulama, bileşen bırakıldığında bağlamın elden çıkarılmasını sağlar:
public void Dispose()
{
Context?.Dispose();
}
Son olarak, OnInitializedAsync Yeni bağlam oluşturmak için geçersiz kılınır. Örnek uygulamada, OnInitializedAsync kişiyi aynı yönteme yükler:
protected override async Task OnInitializedAsync()
{
Busy = true;
try
{
Context = DbFactory.CreateDbContext();
Contact = await Context.Contacts
.SingleOrDefaultAsync(c => c.Id == ContactId);
}
finally
{
Busy = false;
}
await base.OnInitializedAsync();
}
Yukarıdaki örnekte:
- ,
BusyOlarak ayarlandığındatrue, zaman uyumsuz işlemler başlayabilir. ,Busy' A geri ayarlandığındafalse, zaman uyumsuz işlemlerin bitmesi gerekir. - Bir blokta ek hata işleme mantığı yerleştirin
catch.
Hassas verileri günlüğe kaydetmeyi etkinleştir
EnableSensitiveDataLogging özel durum iletileri ve çerçeve günlüğe kaydetme içindeki uygulama verilerini içerir. Günlüğe kaydedilen veriler, varlık örneklerinin özelliklerine atanan değerleri ve veritabanına gönderilen komutlara yönelik parametre değerlerini içerebilir. verileri günlüğe kaydetme EnableSensitiveDataLogging , veritabanına karşı yürütülen SQL deyimlerini günlüğe kaydederken parolaları ve diğer kişisel bilgileri (pıı) açığa çıkarabilecek bir güvenlik riskidir.
Yalnızca EnableSensitiveDataLogging geliştirme ve test için etkinleştirme yapmanızı ö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