You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里的配置逻辑完全对齐。

额外验证步骤

  1. 确认你的项目已经安装了对应版本的NuGet包:EntityFramework(6.0.x)、EntityFramework.SqlServer、EntityFramework.SqlServerCompact
  2. 这个DbConfiguration子类不需要额外注册,EF6会自动扫描并应用它的配置,只要它在你的项目程序集中就行。

内容的提问来源于stack exchange,提问作者Felix D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:17