如何使用 Entity Framework Core 编写可缩放代码以进行自动缩放

How to write scalable code using Entity Framework Core for autoscaling

提问人:Anjo 提问时间:11/12/2023 最后编辑:marc_sAnjo 更新时间:11/12/2023 访问量:79

问:

在学习如何编写可缩放应用程序时,我遇到了一个与 Entity Framework Core (EF Core) 相关的问题。EF Core 在使用新数据库时利用连接字符串、和迁移。DbContext

因此,每次添加新数据库时,都需要提供特定的详细信息,例如连接字符串。在自动缩放的上下文中,由于要添加的数据库的确切数量及其相应的连接字符串仍然未知,因此出现了挑战。

经过研究,我发现可以创建一个工厂来动态生成实例。方法如下:DbContextDbContext

public class DbContextFactory
{
    private readonly IServiceProvider _serviceProvider;

    public DbContextFactory(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public DbContext CreateDbContext(string databaseName)
    {
        var optionsBuilder = new DbContextOptionsBuilder<DbContext>();
        optionsBuilder.UseSqlServer(GetConnectionStringForDatabase(databaseName));

        return ActivatorUtilities.CreateInstance<DbContext>(_serviceProvider, optionsBuilder.Options);
    }

    private string GetConnectionStringForDatabase(string databaseName)
    {
        // get connection string for each database
    }
}

对我来说,它仍然不能解决问题,因为我们必须知道连接字符串。

如何开发动态生成连接字符串和实例的代码,以有效管理自动缩放的不可预测性?DbContext

C# .NET Azure Entity-Framework-Core 自动缩放

评论

0赞 Gert Arnold 11/12/2023
创建数据库实例和上下文实例是两个完全不同的概念。创建上下文实例通常不需要扩展。请提供有关您实际想要实现的目标的更多详细信息。
0赞 Anjo 11/12/2023
@GertArnold 假设我必须设计一个系统,其中所有写入都转到 master 数据库,所有读取都转到另一个读取数据库。在这种情况下,我必须在应用程序中创建 2 个 DbContext,一个用于主数据库,另一个用于读取数据库。但是,如果我想进一步扩展读取数据库以包含 5 个数据库,会发生什么情况?在这种情况下,如何动态创建 DbContexts 和连接字符串?
0赞 Steve Py 11/13/2023
您正在尝试解决什么问题场景?可扩展的应用程序不仅仅是添加额外的数据库。该要求决定了哪些方法可能最有效。例如,对于多租户系统,我使用了主身份验证数据库(具有故障转移副本),其中该数据库实质上将生成的连接字符串存储到每个租户的数据实例中。这与我可能希望跨海量数据集并行读取或支持只读副本进行报告等的方案不同。
0赞 Anjo 11/13/2023
@StevePy 场景是,我有一个主数据库,所有写入都发生,一个只读副本,所有读取都定向。每当发生写入操作时,数据都会从主副本复制到只读副本。我有两个数据库上下文和两个连接字符串。我打算将此系统部署到 Azure,并为数据库实例启用自动缩放,特别是对于只读副本。因此,我需要修改数据上下文代码,以确保在添加新数据库时,读取将在新创建的数据库中随机分布。

答: 暂无答案