ASP.NET 5 多个 dbcontext 问题

Posted

技术标签:

【中文标题】ASP.NET 5 多个 dbcontext 问题【英文标题】:ASP.NET 5 multiple dbcontext problems 【发布时间】:2016-02-05 13:57:43 【问题描述】:

我正在使用新的 ASP.NET 5 beta 8,当我有两个 dbcontext 时遇到了问题。

我有以下项目结构。

-Data(Identity 3 db with other entities)
-Resources (Contains a db with translations)
-WebApp 

在 WebApp 中剥离 Startup.cs 中的一些代码

 public void ConfigureServices(IServiceCollection services)
 
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<DatabaseContext>(opt => opt.UseSqlServer(Configuration["Data:MainDb:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<DatabaseContext>()
            .AddDefaultTokenProviders();

        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ResourceDbContext>(opt => opt.UseSqlServer(Configuration["Data:Resources:ConnectionString"]));

        services.AddTransient<IResourceDbContext, ResourceDbContext>();
        services.AddTransient<IDatabaseContext, DatabaseContext>();

在 ResourceDbContext 和 DatabaseContext 中,我执行以下操作

    public ResourceDbContext(DbContextOptions options) : base(options)
    
        _connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
    


    protected override void OnConfiguring(DbContextOptionsBuilder options)
    
        options.UseSqlServer(_connectionString);
    

但是,当我从 appsettings.json 读取连接字符串时,我在 ConfigureServices 中收到了正确的值。但 DbContextOptions 仅包含最新加载的值,在本例中为资源的连接字符串。因此,两个 dbcontext 都建立了与 Resource db 的连接。

我无法找到有关此的任何信息。

【问题讨论】:

【参考方案1】:

您需要做的只是表明 DbContextOptions 是一个泛型类型:

public ResourceDbContext(DbContextOptions<ResourceDbContext> options) : base(options)



现在,依赖注入系统可以在创建 ResourceDbContext 并将其注入构造函数时找到正确的依赖项 (DbContextOptions options)。

See implementation AddDbContext method


米罗斯拉夫·西斯卡:

public class GetHabitsIdentity: IdentityDbContext<GetHabitsUser, IdentityRole, string> where TUser : IdentityUser

    public GetHabitsIdentity(DbContextOptions<GetHabitsIdentity> options)
        :base(options)
    

            

【讨论】:

【参考方案2】:

您可以将 EF 与不同的连接字符串一起使用。我没有在您的代码中看到错误。我使用了这个设置。

services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationContext>(options =>
                options.UseSqlServer(Configuration["Data:OtherConnection:ConnectionString"]));

在 DBContext 类中

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

    public DbSet<Localizations> Localizations  get; set; 
    private string _connectionString;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        _connectionString = ((SqlServerOptionsExtension)optionsBuilder.Options.Extensions.First()).ConnectionString;
        Console.WriteLine($"ApplicationDbContext_connectionString");
    


public class ApplicationContext : DbContext

    private string _connectionString;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    
        _connectionString = ((SqlServerOptionsExtension)optionsBuilder.Options.Extensions.First()).ConnectionString;
        Console.WriteLine($"ApplicationContext_connectionString");
    

【讨论】:

【参考方案3】:

感谢您的大力帮助!!!

完整的解决方案:

  public class TenantDbContext : IdentityDbContext<ApplicationUser, IdentityRole, string>

    private string _connectionString  get; set;   

    public TenantDbContext(DbContextOptions<TenantDbContext> options) : base(options)  
    
        this._connectionString = "Connection String";
    

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     
        optionsBuilder.UseSqlServer(_connectionString); 
    

ASP.NET 5 DI 用于将 DbContext 和 UserManager 注入控制器。现在可以登录和注册多个数据库...现在我只需要检查如何在此处注入连接字符串: this._connectionString = "Connection String";但这很简单...再次感谢您!

【讨论】:

以上是关于ASP.NET 5 多个 dbcontext 问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core DbContext 注入

将 ASP.NET 标识集成到现有 DbContext 中

ASP.NET vNext EF7 dbContext 问题

ASP.NET Identity DbContext 混淆

ASP.NET EF - DbContext 的 DbSet 未更新

ASP.NET MVC,EntityFramework,DBContext,不同项目中的存储库[关闭]