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 vNext EF7 dbContext 问题