ABP动态配置数据库连接 Oracle11g数据库
ABP的仓储关于数据库连接字符串的配置是从web.config(app.config)的connectionStrings读取的。
我想实现的功能是使用Consul的KV加密存储Oracle数据库的连接字符串,在ABP的应用层动态获取。
采用的ABP版本4.7,.Net Famework 4.61,Oracle 数据库11.2,vs2019,Win7。
尝试过 [DbConfigurationType(typeof(DapperDbContextConfiguration3))]依赖,使用DbConfiguration的SetProviderFactory,SetProviderServices,结果失败。提示需要连接SQLServer数据库,然后从DataProvider入手,采用IConnectionStringResolver或DefaultConnectionStringResolver还是失败。
解决方案:
ABP提供了Configuration.DefaultNameOrConnectionString来动态配置连接字符串,这个很容易实现运行时配置。
在应用层模块中,任意模块中都可以。
public override void PreInitialize()
{
//或者使用Consul的方式从配置中心获取
Configuration.DefaultNameOrConnectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.19.19.188)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=dacong)));User ID=dacong;[email protected];"
}
关键还是要与*.config文件进行配合,默认生成的defaultConnectionFactory是SQL Server数据库的,即使你改对了Configuration.DefaultNameOrConnectionString,运行时默认还是采用工厂方法创建SQL server的连接,注定失败。需要把defaultConnectionFactory换成Oracle的。
正确的配置如下
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<connectionStrings>
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="Oracle.ManagedDataAccess.EntityFramework.OracleConnectionFactory, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
<providers>
<provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<oracle.manageddataaccess.client>
<version number="*">
<edmMappings>
<edmMapping dataType="number">
<add name="bool" precision="1" />
<add name="byte" precision="3" />
<add name="int16" precision="5" />
<add name="int32" precision="10" />
<add name="int64" precision="19" />
</edmMapping>
</edmMappings>
</version>
</oracle.manageddataaccess.client>