EF配置从app.config迁移至代码时,无法设置ProviderService的构造函数问题
解决EF6代码配置中ProviderServices构造函数的问题
我来帮你搞定这个问题——你碰到的核心卡点是EF6的SqlCeProviderServices和SqlProviderServices都是单例模式设计的,它们的构造函数是内部的,不允许直接用new实例化,得通过类的静态Instance属性来获取现成的单例对象。
修改后的正确代码
把你的SqlServerCompactConfiguration类改成这样:
public class SqlServerCompactConfiguration : DbConfiguration { public SqlServerCompactConfiguration() { // 保留你之前正确的默认连接工厂设置 SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlCeConnectionFactory("System.Data.SqlServerCe.4.0")); // 使用SqlCeProviderFactory的静态Instance属性 SetProviderFactory("System.Data.SqlServerCe.4.0", System.Data.SqlServerCe.SqlCeProviderFactory.Instance); // 获取SqlCeProviderServices的单例实例,替代new操作 SetProviderServices("System.Data.SqlServerCe.4.0", System.Data.Entity.SqlServerCompact.SqlCeProviderServices.Instance); // SqlProviderServices同样用静态Instance属性 SetProviderServices("System.Data.SqlClient", System.Data.Entity.SqlServer.SqlProviderServices.Instance); } }
为什么要这么改?
- EF6的
ProviderServices实现类(包括SqlServer和SqlServerCompact的版本)都把构造函数设为了内部访问级别,目的是强制开发者使用官方提供的单例实例,避免重复创建导致的资源浪费、配置冲突等问题。 - 对应的
SqlCeProviderFactory也遵循同样的设计,用静态Instance属性获取实例是最规范的做法,和你原来app.config里的配置逻辑完全对齐。
额外验证步骤
- 确认你的项目已经安装了对应版本的NuGet包:
EntityFramework(6.0.x)、EntityFramework.SqlServer、EntityFramework.SqlServerCompact - 这个
DbConfiguration子类不需要额外注册,EF6会自动扫描并应用它的配置,只要它在你的项目程序集中就行。
内容的提问来源于stack exchange,提问作者Felix D.
相关产品推荐
相关产品推荐

