首页 > 解决方案 > AWS Aurora PostgreSQL 集群顶部的 Entity Framework Core,带有一个写入/读取节点和一个只读节点

问题描述

我有一个运行 .NET Core 的 API 网关,它代理 AWS Lambda 函数。使用 Entity Framework Core,这些 Lambda 函数与 AWS Aurora PostgreSQL RDS 集群进行通信。集群包含一个读/写节点和一个只读节点。

在设置 EF Core 期间,我首先使用数据库来搭建脚手架,效果很好。脚手架是在集群的读/写实例上完成的,读写实例是生成的 DatabaseContext 类的上下文连接字符串中引用的内容。

但是,我有一些读取密集型 API 方法(以及生成的 Lambda 函数),我想专门指向我的只读节点(该节点具有来自 AWS 自动管理的读/写节点的亚秒级复制)。但是,我不知道如何在我的 EF Core 实现中进行设置。我是 EF Core 的初学者,所以我很高兴我可以使用一个节点。如何在我的 .NET Core 应用程序中进行设置,以便我可以指定一些查询以转到只读节点?只读节点具有完全相同的模式和对象。

如果我尝试通过 EF Core CLI 使用 db 上下文脚手架创建数据库第一个脚手架,但将其指向只读节点,那会起作用吗?还是惨败?我应该以某种特定的方式进行设置吗?或者我应该避免 EF Core 用于只读节点,而只使用 Dapper 或 SqlKata 之类的东西来执行只读查询并维护自己的连接等?

标签: c#postgresqlentity-framework-coreamazon-aurora

解决方案


假设您的 Context 被命名为DbContext像这样扩展它:

public class RwDbContext : DbContext {}
public class RoDbContext : DbContext {}

然后,Startup.cs注册这个上下文并将它们指向不同的连接字符串:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<RwDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("RwDbContext")));
    services.AddDbContext<RoDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("RoDbContext")));
}

还将连接字符串添加到您的appsettings.json

{
  "ConnectionStrings": {
    "RwDbContext": "Host=rwdb;...",
    "RoDbContext": "Host=rodb;..."
  }
}

现在您可以使用RoDbContext阅读和RwDbContext写作。

但是从现在开始,在与您交互时,dotnet ef您必须使用该--context <DBCONTEXT>选项将其指向 R/W 上下文。


推荐阅读