为同一个 DBContext 使用多个连接字符串
Using multiple connection strings for the same DBContext
我正在开发一个 asp.net 核心项目,它使用 MongoDB,我也在使用依赖注入。
当前系统如何工作
只有一个数据库,连接字符串保存在appsettings.json中。一些设备会不断地通过 API 发送数据以将其保存在 MongoDB 数据库中,该数据库可以正常工作:)
现在我要加强它,会有多个数据库,数据应该根据API请求保存在相关数据库中(我将在API中获取数据库名称要求)。
我的问题是如何根据 API 请求更改数据库?同时使用相同的 DbContext。不能选择创建多个 DbContext。
我对 MongoDb 和 asp.net 核心有些陌生,因此非常感谢任何帮助或指导。
这是我的 DbContext class
public class DbContext
{
private IMongoDatabase _database;
protected readonly MongoClient mongoClient;
public DbContext(MongoSetting dbConnSettings)
{
var mongoUrl = new MongoUrl(dbConnSettings.ConnectionString);
var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl);
mongoClient = new MongoClient(mongoClientSettings);
if (mongoClient != null)
_database = mongoClient.GetDatabase(dbConnSettings.database);
}...
我的启动部分class
services.AddTransient<CareHomeContext>();
services.AddSingleton(provider => provider.GetService<IOptions<MongoSetting>>().Value);
如果我正确理解您的用例,可能还需要在每个请求中使用不同的数据库。
因此,我建议将数据库名称作为可选参数(以便您可以使用配置中的默认值,以防请求中未提供数据库名称)到 DbContext
class 方法并在 DbContext
class 中创建一个方法来获取数据库对象(而不是在构造函数中获取它),如下所示。
private IMongoDatabase GetDatabase(string databaseName) => mongoClient.GetDatabase(databaseName ?? defaultDatabaseName);
在每个DbContext
class方法中调用上述方法。例如
public async Task InsertAsync(string collectionName, Dictionary<string, object> fields, string databaseName = null) {
var database = GetDatabase(databaseName);
// Insert Code here
}
希望对您有所帮助。
我正在开发一个 asp.net 核心项目,它使用 MongoDB,我也在使用依赖注入。
当前系统如何工作
只有一个数据库,连接字符串保存在appsettings.json中。一些设备会不断地通过 API 发送数据以将其保存在 MongoDB 数据库中,该数据库可以正常工作:)
现在我要加强它,会有多个数据库,数据应该根据API请求保存在相关数据库中(我将在API中获取数据库名称要求)。
我的问题是如何根据 API 请求更改数据库?同时使用相同的 DbContext。不能选择创建多个 DbContext。
我对 MongoDb 和 asp.net 核心有些陌生,因此非常感谢任何帮助或指导。
这是我的 DbContext class
public class DbContext
{
private IMongoDatabase _database;
protected readonly MongoClient mongoClient;
public DbContext(MongoSetting dbConnSettings)
{
var mongoUrl = new MongoUrl(dbConnSettings.ConnectionString);
var mongoClientSettings = MongoClientSettings.FromUrl(mongoUrl);
mongoClient = new MongoClient(mongoClientSettings);
if (mongoClient != null)
_database = mongoClient.GetDatabase(dbConnSettings.database);
}...
我的启动部分class
services.AddTransient<CareHomeContext>();
services.AddSingleton(provider => provider.GetService<IOptions<MongoSetting>>().Value);
如果我正确理解您的用例,可能还需要在每个请求中使用不同的数据库。
因此,我建议将数据库名称作为可选参数(以便您可以使用配置中的默认值,以防请求中未提供数据库名称)到 DbContext
class 方法并在 DbContext
class 中创建一个方法来获取数据库对象(而不是在构造函数中获取它),如下所示。
private IMongoDatabase GetDatabase(string databaseName) => mongoClient.GetDatabase(databaseName ?? defaultDatabaseName);
在每个DbContext
class方法中调用上述方法。例如
public async Task InsertAsync(string collectionName, Dictionary<string, object> fields, string databaseName = null) {
var database = GetDatabase(databaseName);
// Insert Code here
}
希望对您有所帮助。