【问题标题】:How to add DbContext at runtime如何在运行时添加 DbContext
【发布时间】:2019-11-22 09:16:42
【问题描述】:

我正在尝试在运行时添加DbContext。我这样做的原因是因为客户端使用不同的数据库模式。通过这样做,我无法将其添加到 StartUpConfigureServices 方法中,因为我需要先了解客户端,然后尝试在其中创建具有适当模式的连接字符串,因为每次请求时都会调用 Configure 方法制作。我尝试访问IServiceCollection,但容器显示没有IServiceCollection 类型的服务已注册。我现在尝试在 startUp 的 ConfigureServices 方法中注册 IServiceCollection 本身,然后应用程序拒绝完全启动。有没有更好的方法在运行时添加它?

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceCollection services)
        {
            // global cors policy
            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());


            app.UseAuthentication();
            app.UseMvc();

            IClientValidator clientValidator = app.ApplicationServices.GetRequiredService<IClientValidator>();
            services.AddDbContext<ClientDbContext>(options =>
                options.UseSqlServer(clientValidator.GetConnectionString()));
        }

客户端验证器负责解析客户端连接字符串。

【问题讨论】:

  • 您可以编写一个工厂并将其注册到运行时返回相应上下文的 DI 容器中。
  • 两个客户端是否共享相同的业务逻辑,即使它们具有不同的架构设计?如果不是,那么它们不属于同一个应用程序,如果是,那么您可以使用策略模式在实现之间切换。
  • 如果两个客户端的逻辑相同。那么最好只更改连接字符串而不是使用两个 DbContext。
  • 好的,我想让我解释一下整个逻辑,以便您明白我的意思。客户端具有不同的模式并且位于不同的数据库中(因为这是大数据应用程序),因此当客户端发出请求(基本上是 url)时,系统会检测到客户端,然后转到另一个知道所有信息的 Dbcontext每个客户端并检索它将连接到的适当数据库和模式,然后配置连接字符串以放入连接。所以另一个DbContext没有和另一个相同的数据库表。
  • 哇!非常感谢。我决定像往常一样添加DbContext,然后我将使用DbContext 类的OnConfiguring 方法在那里设置连接字符串。但还有一件事,我希望在每个请求上都创建连接字符串。是否可以将DbContext 添加为AddTransient&lt;&gt;()?还是每次请求都调用OnConfiguring方法?

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

好的,我通过添加 QueryTrackingBehaviour.NoTracking 重载 AddDbContext 解决了重新初始化问题

services.AddDbContext<DatabaseContext>(options =>
{
    options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
    options.UseSqlServer(databaseSettings.DefaultConnection);
});

最重要的是,我没有在启动文件中执行此操作,而是通过覆盖DbContextOnConfiguring 方法来初始化连接,但在上述讨论之前我找到了更好的解决方案。解决方法如下

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connectionString).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多