文章背景
最近项目开发在做数据库迁移,由于原先项目框架中采用微软企业库(Enterprise Library)连接MSSQL做了封装,由于官方对企业库已停更,而企业库对第三方数据库的支持需要扩展类库的支持,第三方类库大多数对企业库的支持也并没有跟进到企业库的最新版本6.0,而且处于放弃继续更新的状态,而原来项目中引用的企业库恰好是最新的Enterprise Library6.0版,在尝试将Enterprise Library连接PostgreSQL数据库的过程遇到不少坑,博主在搜寻了大量网上资料和测试后决定将Enterprise Library连接PostgreSQL避坑注意事项做一番归纳。
正文如下
微软企业库Enterprise Library目前官方已停更,虽然最新版本是6.0,但默认支持的数据库有MSSQL和Oracel,
对其他数据库的支持需要相应Provider扩展类库(比如针对MySQL的EntLibContrib.Data.MySql.dll)的支持,而目前存在的第三方扩展类库只支持到EnterpriseLibrary4.1.0, 而之后直到EnterpriseLibrary6.0版本的相应扩展类库未有提供,因此,用企业库连接PostgreSQL需要引入的企业库版本只能是4.1.0,不能是6.0(另外,这两个版本创建Database实例的方法有所不同) ,
Enterprise Library4.1的扩展类库支持非常不错(http://entlibcontrib.codeplex.com/releases/view/38988),支持了SQLServer、DB2、MySql、ODP.NET(Oracle)、PostgreSQL、SQLite、SqlEx等数据库。
针对PostgreSQL,我们需要下载引入扩展类库EntLibContrib.Data.PostgreSql.dll (Nuget上只能找到MySQL的,PostgreSql的博主是从网上搜寻的,这里已上传提供下载),同时引入Npgsql(可以从Nuget获取),由于获取的版本是4.0.10,配置文件需要注意依赖程序集的版本说明,没有的话需要手动加入(博主试过没有为Npgsql配置dependentAssembly项时PostgreSql.dll内部调用时指向的npgsql版本为2.x.x而出错)。
Web.config为企业库配置以下数据库信息:
<configSections>
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data" />
</configSections>
<connectionStrings>
<!--PostgreSQL数据库的连接字符串-->
<add name="post" connectionString="server=****;port=****;uid=***;pwd=******;database=*****" providerName="Npgsql" />
</connectionStrings>
<dataConfiguration defaultDatabase="post">
<!--对于一些扩展支持的数据库,我们除了添加连接字符串之外还需要添加一些映射处理-->
<providerMappings>
<add databaseType="EntLibContrib.Data.PostgreSql.NpgsqlDatabase, EntLibContrib.Data.PostgreSql" name="Npgsql" />
</providerMappings>
</dataConfiguration>
以下是程序测试运行结果:
总结:
1. 企业库EntLib连接PostgreSQL,目前企业库版本必需是4.1.0;
2. 引入相应扩展类库EntLibContrib.Data.PostgreSql.dll;
3. 引用Npgsql;
4. 配置dataConfiguration、connectionStrings、providerMappings(扩展支持的数据库需要添加的映射处理)信息;
5. 注配置文件中的Npgsql(指定4.0.10.0版本)、企业库(无需指定)的依赖程序集dependentAssembly信息是否版本匹配有误;
6. 注意EntLib4.1.0与EntLib6.0版本创建Database实例的方法不同(6.0中是DatabaseProviderFactory实例的CreateDefault和Create方法;4.1.0中是DatabaseFactory静态类的CreateDatabase方法)。
以下是网上搜寻的资料,对本人起到莫大的帮助,感谢:
- 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持: https://www.cnblogs.com/wuhuacong/p/5866722.html 、 https://www.jianshu.com/p/240b9eb660db
- 用 Enterprise Library 4.1 链接 SQLite: https://www.cnblogs.com/zzmsl/archive/2012/06/08/2542143.html
- 在开发框架中扩展微软企业库,支持使用ODP.NET(Oracle.ManagedDataAccess.dll)访问Oracle数据库: https://www.iambigboss.top/post/38344_1_1.html
- dotConnect for PostgreSQL Documentation Enterprise Library Data Access Block: https://www.devart.com/dotconnect/postgresql/docs/EnterpriseLib.html
- DotNet 项目中集成 Enterprise Library 数据库访问模块:https://blog.csdn.net/a495023351/article/details/102059720