在运行时动态切换 Repository 中的 Dbcontext 连接字符串

问题描述 投票:0回答:0

问题:我有一组具有相同数据结构的数据库和表。我有一个服务器列表、目录和登录信息。我想遍历服务器列表,并设置 dbcontext 连接字符串,这样我就可以从每个实例中完全相同的表中读取数据,并返回配置信息列表。我遵循使用 CQRS 的 SOLID Principle Design,这是一个运行良好的 .Net 7 解决方案。只是想知道,是否可以在存储库级别设置连接字符串,当数据访问发生时,而不必注册每个实例,或将其保存在应用程序设置中。我可以传递连接字符串,但需要在 dbcontext 中设置它。感谢您的帮助。

示例 DbContext 类:

namespace DemoApp.Persistence.DomainDbContext;

public partial class DemoDbContext : DbContext
{
    public DemoDbContext(DbContextOptions<DemoDbContext> options)
        : base(options)
    {
    }


    public virtual DbSet<ConfigSystem> ConfigSystems { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
      
        modelBuilder.Entity<ConfigSystem>(entity =>
        {
            entity.HasKey(e => e.ConfigSystemGuid);

            entity.ToTable("ConfigSystem", "dbo", tb => tb.HasTrigger("Tr_ConfigSystem_Update"));

            entity.HasIndex(e => e.ConfigSystemName, "UX_ConfigSystem").IsUnique();

            entity.Property(e => e.ConfigSystemGuid)
                .HasDefaultValueSql("(newsequentialid())")
                .HasColumnName("ConfigSystemGUID");
            entity.Property(e => e.EnvironmentId)
                .HasMaxLength(250)
                .IsUnicode(false)
                .HasColumnName("EnvironmentID");
            entity.Property(e => e.EnvironmentType)
                .HasMaxLength(50)
                .IsUnicode(false);
            entity.Property(e => e.Version)
                .HasMaxLength(25)
                .IsUnicode(false)
                .HasDefaultValueSql("((1))");
            entity.Property(e => e.VersionDate)
                .HasDefaultValueSql("(getdate())")
                .HasColumnType("smalldatetime");
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}


**Sample Repository class:** 

namespace DemoApp.Persistence.Repositories
{
    public class ConfigSystemRepository : DemoAppBaseRepository<ConfigSystem>, IConfigSystemRepository
    {
        public ConfigSystemRepository(DemoAppDbContext dbContext) : base(dbContext)
        {
        //How to rest the connection string on the dbcontext to point to the right server/database
        }

        private readonly string DemoConnectionString = Persistence.PersistenceServiceRegistration.ConntectionSting;

        public string GetDemoAppCn()
        {
            return DemoConnectionString ;
        }

        public async Task<List<ConfigSystem>> GetConfigSystemList()
        {
            return await _dbContext.ConfigSystems.Take(10).ToListAsync();
        }
     
        public async Task<ConfigSystem> GetConfigSystemItem()
        {
            return await _dbContext.ConfigSystems.FirstOrDefaultAsync();
        }       
    }
}
c# entity-framework
© www.soinside.com 2019 - 2024. All rights reserved.