【发布时间】:2022-01-11 18:21:46
【问题描述】:
其实我是从Blazor 和EF Core 开始的。在注册DbContext 时,我被卡住了。 DbContext 可以注册到AddDbContext 或AddDbContextFactory。但是有什么区别呢?
builder.Services.AddDbContext<DataContext>(opt => opt.UseSqlServer("..."));
builder.Services.AddDbContextFactory<DataContext>(opt => opt.UseSqlServer("..."));
从文档中我得到了以下信息:
AddDbContext:
使用依赖注入时使用此方法...
Entity Framework Core 不支持在同一个 Microsoft.EntityFrameworkCore.DbContext 实例上运行多个并行操作。这包括异步查询的并行执行和来自多个线程的任何显式并发使用。
AddDbContextFactory:
建议在 Blazor 应用程序和其他依赖注入范围与上下文生命周期不一致的情况下注册工厂...
为方便起见,此方法还将上下文类型本身注册为范围服务。这允许上下文实例直接从依赖注入范围解析或由工厂创建,视情况而定。
所以我们可以全局说,如果程序需要从不同的线程访问DbContext,或者同时需要使用AddDbContextFactory 注册上下文,因为当它被创建时(例如在控制器中)设置为作用域,所以我们每次都会得到一个新的DbContext?
private readonly DataContext _dbContext;
public BlogController(IDbContextFactory<DataContext> dbFactory)
{
// Will be created as SCOPED DbContext?
_dbContext = dbFactory.CreateDbContext();
}
我还发现了一个类似的问题here。 AddDbContext 和 AddDbContextFactory 内的生命周期是在注册期间设置的。或者我错过了什么。
所以我的问题一般是:
- 何时使用
AddDbContextFactory而不是AddDbContext? -
DbContextFactory和AddDbContext与DbContext的生命周期有何不同? - 我应该将
DbContextFactory用于Blazor项目吗? - 在
DbContext的生命周期内创建DbContext时是否存在内存开销?
【问题讨论】:
-
“我应该通常将 DbContextFactory 用于 Blazor 项目吗?” -> “建议为 Blazor 应用程序注册工厂...” -> 你为什么要问 我们 什么时候微软已经推荐了?
-
@CamiloTerevinto:因为对于 why 以及 how 和 when 仍然存在很多混淆. Blazor 仍然很新,有两种截然不同的口味。
标签: c# entity-framework-core blazor dbcontext lifetime