gpt4 book ai didi

entity-framework - 如何在 .NETCore 3.1 和 Blazor 中创建 DbContextFactory

转载 作者:行者123 更新时间:2023-12-03 23:11:34 25 4
gpt4 key购买 nike

我正在遵循有关如何设置 EF Core 以在 Blazor 和 .NET Core 3.1 中安全工作的指南。
MS 文档在这里:https://docs.microsoft.com/en-us/aspnet/core/blazor/blazor-server-ef-core?view=aspnetcore-3.1
在说明中,建议创建一个 DbContextFactory,用于在每个服务中创建一个 dbcontext。在 Blazor 世界中一切都有意义,但代码不会编译为
AddDbContextFactory 不存在。如果在 .Net Core 3.1/EF Core 3 中有另一种方法可以做到这一点 - 我看不到它。

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

最佳答案

我发现 Microsoft 文档页面在其示例 github 项目中使用的 this extension method:

        public static IServiceCollection AddDbContextFactory<TContext>(
this IServiceCollection collection,
Action<DbContextOptionsBuilder> optionsAction = null,
ServiceLifetime contextAndOptionsLifetime = ServiceLifetime.Singleton)
where TContext : DbContext
{
// instantiate with the correctly scoped provider
collection.Add(new ServiceDescriptor(
typeof(IDbContextFactory<TContext>),
sp => new DbContextFactory<TContext>(sp),
contextAndOptionsLifetime));

// dynamically run the builder on each request
collection.Add(new ServiceDescriptor(
typeof(DbContextOptions<TContext>),
sp => GetOptions<TContext>(optionsAction, sp),
contextAndOptionsLifetime));

return collection;
}
工厂类是 here :
    public class DbContextFactory<TContext> 
: IDbContextFactory<TContext> where TContext : DbContext
{
private readonly IServiceProvider provider;

public DbContextFactory(IServiceProvider provider)
{
this.provider = provider;
}

public TContext CreateDbContext()
{
if (provider == null)
{
throw new InvalidOperationException(
$"You must configure an instance of IServiceProvider");
}

return ActivatorUtilities.CreateInstance<TContext>(provider);
}
}

关于entity-framework - 如何在 .NETCore 3.1 和 Blazor 中创建 DbContextFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63936399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com