9.18 多数据库操作
9.18.1 Fur 支持数据库提供器
| SqlServer | Sqlite | Cosmos | InMemoryDatabase | MySql | PostgreSQL | Oracle | Firebird | Dm |
|---|---|---|---|---|---|---|---|---|
| ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
9.18.1.1 数据库提供器对应包
SqlServer:Microsoft.EntityFrameworkCore.SqlServerSqlite:Microsoft.EntityFrameworkCore.SqliteCosmos:Microsoft.EntityFrameworkCore.CosmosInMemoryDatabase:Microsoft.EntityFrameworkCore.InMemoryMySql:Pomelo.EntityFrameworkCore.MySqlPostgreSQL:Npgsql.EntityFrameworkCore.PostgreSQLOracle:Citms.EntityFrameworkCore.OracleFirebird:FirebirdSql.EntityFrameworkCore.FirebirdDm:Microsoft.EntityFrameworkCore.Dm
小知识
这些数据库包应该安装在 Fur.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 多数据库使用方式
Fur 通过独创的 数据库上下文定位器 实现多数据库灵活操作切换。只需要为每一种数据库绑定唯一的数据库上下文定位器即可。
以下是 Fur 支持多数据库操作的实例:
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 反馈与建议
与我们交流
给 Fur 提 Issue。