.NET Framework从2.0升级到4.71时SQL/Oracle转System.Data.Entity.Database报错
解决.NET Framework 2.0升级到4.7.1时数据库类型转换错误的问题
我来帮你梳理下这个问题的核心和解决方案——你遇到的其实是两个不同Database类的命名冲突/类型不兼容问题,在.NET Framework版本升级过程中很容易踩这个坑。
问题根源
你的代码同时引用了两个完全不同的Database类型:
- 一个是Enterprise Library数据访问组件里的
Microsoft.Practices.EnterpriseLibrary.Data.Database - 另一个是Entity Framework里的
System.Data.Entity.Database
升级到.NET 4.7.1后,程序集引用、命名空间解析的规则变化,导致原本隐式的类型冲突暴露出来,无法直接转换。
具体解决方案
1. 明确区分两个Database类型
首先要在代码里清晰区分这两个类型,避免命名空间混淆:
- 可以给命名空间添加别名,在
using语句里指定:
// 给Enterprise Library的Database加别名 using EntLibDb = Microsoft.Practices.EnterpriseLibrary.Data.Database; // 给Entity Framework的Database加别名(如果确实需要用的话) using EFDb = System.Data.Entity.Database;
- 确保你的
GetDatabase方法的返回类型是你实际需要的那个Database——如果是要返回Enterprise Library的数据库实例,就把返回类型写成EntLibDb,而不是默认的Database(避免编译器自动解析到EF的类型)
2. 升级Enterprise Library到兼容.NET 4.7.1的版本
.NET Framework 2.0对应的旧版Enterprise Library(比如3.1/4.0版本)和.NET 4.7.1兼容性很差,你需要:
- 升级到Enterprise Library 6.0,它原生支持.NET 4.0及以上版本,完美适配4.7.1
- 对于Oracle的
EntLibContrib.Data.OdpNet组件,要找对应支持.NET 4.0+的版本,建议使用最新的贡献库包,避免驱动兼容问题
3. 修正GetDatabase方法的实现
假设你原本是要返回Enterprise Library的数据库实例,补全并修正后的方法大概是这样:
using EntLibContrib.Data.OdpNet; using Microsoft.Practices.EnterpriseLibrary.Data; using Microsoft.Practices.EnterpriseLibrary.Data.Sql; using EntLibDb = Microsoft.Practices.EnterpriseLibrary.Data.Database; public EntLibDb GetDatabase(string name) { // 示例逻辑:根据数据库名称返回对应的实例 if (name.Equals("SQLDB", StringComparison.OrdinalIgnoreCase)) { return new SqlDatabase("你的SQL Server连接字符串"); } else if (name.Equals("OracleDB", StringComparison.OrdinalIgnoreCase)) { return new OracleDatabase("你的Oracle连接字符串"); } // 或者用Enterprise Library的工厂类来创建(推荐,依赖配置文件) return DatabaseFactory.CreateDatabase(name); }
注意:如果你原本的需求是要和Entity Framework结合使用,那不能直接把Enterprise Library的
Database转换成EF的Database——这两个是完全独立的数据访问组件,你需要重新设计数据访问层,要么改用EF的上下文(DbContext),要么继续使用Enterprise Library做数据操作。
4. 清理冗余配置和引用
- 移除项目中旧版本的Enterprise Library程序集引用,替换成新版本的
- 检查
App.config/Web.config里的Enterprise Library配置节,确保和新版本匹配(比如6.0版本的配置结构和旧版有差异) - 确认Oracle的ODP.NET驱动版本和.NET 4.7.1兼容,推荐使用ODP.NET Managed Driver,它不需要安装客户端,对高版本.NET支持更好
内容的提问来源于stack exchange,提问作者sharcfinz
相关产品推荐
相关产品推荐

