Проблемы с производительностью при изменении схемы БД во время выполнения в .Net Core - PullRequest
1 голос
/ 26 июня 2019

Я работаю в приложении Multi Tenant, где у каждого пользователя разные схемы базы данных.

На основании учетных данных пользователя мы получим, к какой схеме он принадлежит.

Ниже приведен мой класс контекста, который динамически обновляет контекст каждый раз в зависимости от имени схемы

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

public string SchemaName { get; set; }


public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
    : base(options)
{

}

public ApplicationDbContext(string schemaname)
    : base()
{
    SchemaName = schemaname;
}

public DbSet<EmployeeDetail> EmployeeDetail { get; set; }



protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

    var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
                  .AddJsonFile("appsettings.json");
    var configuration = builder.Build();

    var serviceProvider = new ServiceCollection().AddEntityFrameworkSqlServer()
                        .AddSingleton<IModelCustomizer, SchemaContextCustomize>()
                        .BuildServiceProvider();
    optionsBuilder.UseSqlServer(configuration["ConnectionStrings:SchemaDBConnection"]).UseInternalServiceProvider(serviceProvider);
}


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   // modelBuilder.MapProduct(SchemaName);

    modelBuilder.RemovePluralizingTableNameConvention();
    if (!string.IsNullOrEmpty(SchemaName))
    {
        modelBuilder.HasDefaultSchema(SchemaName);
    }
    base.OnModelCreating(modelBuilder);
}

public string CacheKey
{
    get { return SchemaName; }
}

public class SchemaContextCustomize : ModelCustomizer
{
    public SchemaContextCustomize(ModelCustomizerDependencies dependencies)
        : base(dependencies)
    {

    }
    public override void Customize(ModelBuilder modelBuilder, DbContext dbContext)
    {
        base.Customize(modelBuilder, dbContext);

        string schemaName = (dbContext as ApplicationDbContext).SchemaName;
        (dbContext as ApplicationDbContext).SchemaName = schemaName;

    }
}

Над кодом работает без проблем. OnConfiguring метод отвечает за предоставление правильной схемы каждый раз

Основное беспокойство связано с производительностью. Для каждого запроса, указанного ниже, каждый раз для инициализации контекста требуется почти 40% времени

base.Customize(modelBuilder, dbContext);

Есть ли способ повысить производительность, в идеале это следует назвать один раз.

Как правильно изменить схему во время выполнения в зависимости от пользователя, чтобы метод OnConfiguring вызывался только один раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...