- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 PostgreSQL 并且我有如下 ApplicationDbContext:
public class ApplicationDbContext : DbContext
{
private readonly DatabaseSettings _databaseOptions;
public ApplicationDbContext() { }
public ApplicationDbContext(IOptions<DatabaseSettings> databaseOptions)
{
_databaseOptions = databaseOptions.Value;
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("citext");
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (_databaseOptions == null)
{
optionsBuilder.UseInMemoryDatabase(Guid.NewGuid().ToString());
}
else
{
optionsBuilder.UseNpgsql(_databaseOptions.ConnectionString,
npgsqlOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: _databaseOptions.MaxRetryCount,
maxRetryDelay: TimeSpan.FromSeconds(_databaseOptions.MaxRetryDelay),
errorCodesToAdd: null);
});
}
}
}
该上下文是许多其他上下文的基础。我正在改进性能并尝试使用上下文池。文档说要添加轮询我应该:
services.AddDbContextPool<EmployeeContext>(options => options.UseNpgsql(connection));
但我想在 OnConfiguring 方法中存储.UseNpgsql 和 DbContext 的其他配置。如何实现?
最佳答案
除了使用它的有争议的好处(来自文档:“具有节省一些 DbContext 实例初始化成本的优势”),DbContext pooling根本不适用于您的场景,因为您的上下文包含 EF Core 不知道的状态:
private readonly DatabaseSettings _databaseOptions;
和 Limitations文档的部分明确指出:
Warning!
Avoid using DbContext Pooling if you maintain your own state (for example, private fields) in your derived DbContext class that should not be shared across requests. EF Core will only reset the state that is aware of before adding a DbContext instance to the pool.
AddDbContextPool
的 optionsAction
是必需的,而 AddDbContext
是可选的,这是有原因的。这是因为上述限制,加上额外的要求,您的 DbContext
派生类必须具有 single 公共(public)构造函数和 single DbContextOptions
参数。通过传递空操作来欺骗 AddDbContextPool
,您可以很容易地看到这一点:
services.AddDbContextPool<ApplicationDbContext>(options => { });
但是在运行时你会得到 InvalidOperationException
说
The DbContext of type 'ApplicationDbContext' cannot be pooled because it does not have a single public constructor accepting a single parameter of type DbContextOptions.
所以为了符合池化的条件,你必须移除所有这些
private readonly DatabaseSettings _databaseOptions;
public ApplicationDbContext() { }
public ApplicationDbContext(IOptions<DatabaseSettings> databaseOptions)
{
_databaseOptions = databaseOptions.Value;
}
然后添加这个
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }
现在您应该清楚地看到为什么您所要求的是不可能的。您的 OnConfiguring
方法需要 DatabaseSettings
,但您无法提供它。因此,选项
必须在外部配置。
换句话说,你的要求是互斥的,因此没有解决方案。
关于c# - 如果所有配置都在 DbContext 的 OnConfiguring 方法中,如何使用 AddDbContextPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819175/
我正在尝试解决 Wicket 页面的一个特性 - 我有一个包含 ajax 选项卡式面板的页面,并且希望用户可以更改 URL,以便下次显示该页面时,该选项卡URL 中指定的一个。 示例: 用户将单击系统
无论如何,您是否可以让应用程序在定向后保持缓冲区,而无需手动处理配置更改。 场景基本: 当方向改变时,应保留直到最新点的视频缓冲区。 需要重新加载一个新的布局(因为纵向和横向的布局不同),因此,让应用
出于某种原因,自从我添加了一个 Application User 类后,它说我有两个我没有的上下文,但我按如下所述创建了该类: public class ApplicationDbContextFac
我遇到了不同的代码 fragment ,关于在 SQLiteHelper 中启用外键约束。我在想,如果我也想支持 API = Build.VERSION_CODES.JELLY_BEAN) {
对于我们的 ASP.NET Core 项目,我们使用包管理器控制台中的 Scaffold-DbContext 搭建现有数据库。 每次我们做脚手架时,上下文类与所有实体一起生成,它包含调用 option
我正在尝试构建一个自定义 View 位置系统。 public class myViewLocationExpander : IViewLocationExpander { private my
我正在使用 PostgreSQL 并且我有如下 ApplicationDbContext: public class ApplicationDbContext : DbContext { pr
一旦我解决了one issue与 IBM.EntityFrameworkCore ,另一个出现了。对于 DB2 和他们的 .NET 团队来说,一切都是那么艰难和痛苦...... 问题:我在同一个 VS
在我的 asp.net core 项目中,我有一个从 DbContext 派生的 ReadingContext 类。根据文档,应该为创建的每个 DbContext 实例调用 OnConfiguring
我正在 Entity Framework 7 中进行数据库优先开发。当我使用命令行从命令行生成我的 DbContext 时 dnx ef dbcontext scaffold [connection
我的 ASP.NET 核心有这个类,它首先被调用 public class Startup { public IConfiguration Configuration { get; }
刚刚开始使用 ASP.NET Core,到目前为止令人印象深刻。在生成的代码中,(见下文)。我想更改硬编码的连接字符串以从 appsettings.json 中获取它文件。 这显然是不可能的。我还没有
我有 DbContext 类以便使用迁移和创建新数据库或为现有数据库创建表。 public class ApplicationDbContext : IdentityDbContext {
我是一名优秀的程序员,十分优秀!