我用 .Net Core
我有一个场景,我需要根据部门 ID 将连接字符串切换到两个具有相同架构的不同数据库。
我有一个名为Department1
旧记录所在位置的数据库,管理层的决定是Department2
通过更新DepartmentToggle
我们Config
数据库中的逗号分隔切换设置来定期移动各个部门的记录。基本上,我们的 ETL 团队会将记录移动到新数据库,并在完成后更新此设置。长期计划是将这些数据库记录移至云端。这是做这件事的第一步。
因此,如果切换设置DepartmentToggle
具有 value "1,2,3"
,则表示 Departments 1, 2, 3 记录在Department2
. 所以,我必须首先DepartmentToggle
从Config
数据库中读取配置值,检查 DepartmentId 是否包含在切换中。如果是,DepartmentContext 必须使用Department2
connectionString。下面是我的上下文类:
public partial class DepartmentContext : DbContext
{
// Required for DI container
public DepartmentContext() { }
// Required for unit testing
public DepartmentContext(DbContextOptions options) : base(options) {}
public virtual DbSet<Faculty> Faculties { get; set; }
public virtual DbSet<Student> Students { get; set; }
......
//More DbSets
//connectionString to change based on the DepartmentId
public static string ConnectionString { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(ConnectionString);
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//modelBuilder.Entity<Faculty>(entity => { });
}
}
有什么建议么?
您可以通过以下方式进行。
public class DepartmentContext : DbContext
{
public DepartmentContext(
IDepartmentRequestContext deptRequestContext,
IConnectionSelector connSelector)
: base(connSelector.GetConnectionString(deptRequestContext.SelectedDepartament))
{
}
}
使用 Scoped 生命周期注册(或 PerRequest 取决于您的容器)创建 DepartmentRequestContext 类。然后您可以创建一个中间件或请求处理程序,它将根据从 Config Db 加载的 1,2,3 设置 SelectedDepartment 值。由于 SelectedDepartment 驻留在 Scoped 实例中,因此在创建期间,您的 Department 上下文中将提供相同的值。
然后在您的 ConnectionSelector 中,您基本上读取基于 SelectedDepartment 的 IOptions 并检索适当的连接字符串。
整个解决方案基于这样一个事实,即应在部门已知并缓存在中间件中之后创建 DepartmentContext。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句