9.18 多数据库操作

9.18.1 Furion 支持数据库提供器#

SqlServerSqliteCosmosInMemoryDatabaseMySqlPostgreSQLOracleFirebirdDm

9.18.1.1 数据库提供器对应包#

  • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
  • SqliteMicrosoft.EntityFrameworkCore.Sqlite
  • CosmosMicrosoft.EntityFrameworkCore.Cosmos
  • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
  • MySqlPomelo.EntityFrameworkCore.MySql
  • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
  • OracleCitms.EntityFrameworkCore.Oracle
  • FirebirdFirebirdSql.EntityFrameworkCore.Firebird
  • DmMicrosoft.EntityFrameworkCore.Dm
小知识

这些数据库包应该安装在 Furion.EntityFramework.Core 层。

9.18.2 多数据库服务注册#

// 注册 SqlServer
options.AddDbPool<FurDbContext>(DbProvider.SqlServer);
// 注册 Sqlite
options.AddDbPool<FurDbContext>(DbProvider.Sqlite);
// 注册 Cosmos
options.AddDbPool<FurDbContext>(DbProvider.Cosmos);
// 注册 InMemoryDatabase
options.AddDbPool<FurDbContext>(DbProvider.InMemoryDatabase);
// 注册 MySql,必须指定版本号
options.AddDbPool<FurDbContext>($"{DbProvider.MySql}@8.0.22");
// 注册 PostgreSQL
options.AddDbPool<FurDbContext>(DbProvider.Npgsql);
// 注册 Oracle
options.AddDbPool<FurDbContext>(DbProvider.Oracle);
// 注册 Firebird
options.AddDbPool<FurDbContext>(DbProvider.Firebird);
// 注册 Dm
options.AddDbPool<FurDbContext>(DbProvider.Dm);
新版 MySQL 注意

MySQL 在新版本包中注册有所修改,所以注册方式为:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurDbContext>($"{DbProvider.MySql}@8.0.22");
});

9.18.3 多数据库使用方式#

Furion 通过独创的 数据库上下文定位器 实现多数据库灵活操作切换。只需要为每一种数据库绑定唯一的数据库上下文定位器即可。

以下是 Furion 支持多数据库操作的实例:

9.18.3.1 实体仓储方式#

// 切换到 MSSQL 操作 Person表
var mssqlRepository = personRepository.Change<Person, MsSqlDbContextLocator>();
// 切换到 MySql 操作 Person表
var mysqlRepository = personRepository.Change<Person, MySqlDbContextLocator>();
// 切换到 Sqlite 操作 Person表
var sqliteRepository = personRepository.Change<Person, SqliteDbContextLocator>();

9.18.3.2 非泛型仓储方式#

// 切换到 MSSQL 操作 Person表
var mssqlRepository = repository.Change<Person, MsSqlDbContextLocator>();
// 切换到 MySql 操作 Person表
var mysqlRepository = repository.Change<Person, MySqlDbContextLocator>();
// 切换到 Sqlite 操作 Person表
var sqliteRepository = repository.Change<Person, SqliteDbContextLocator>();

9.18.3.3 Sql 仓储方式#

// 切换到 MSSQL 操作 Person表
var mssqlRepository = sqlRepository.Change<MsSqlDbContextLocator>();
// 切换到 MySql 操作 Person表
var mysqlRepository = sqlRepository.Change<MySqlDbContextLocator>();
// 切换到 Sqlite 操作 Person表
var sqliteRepository = sqlRepository.Change<SqliteDbContextLocator>();

9.18.3.4 实体定义方式#

// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式#

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议#

与我们交流

给 Furion 提 Issue