ADO.NET匹配非目标DbProvider及EF6项目从SqlServerCe.3.5迁移PostgreSQL咨询
嘿,我来帮你搞定这两个EF6相关的问题,一步步来哈:
问题1:ADO.NET自动加载你不想使用的DbProvider
这种情况通常是配置里残留了该Provider的注册,或者全局机器配置(比如machine.config)里有它的记录,你可以按下面的步骤排查解决:
- 先检查项目的App.config/Web.config,把所有和这个不需要的Provider相关的配置节点删掉:
- 找到
<entityFramework>下的<providers>,移除对应<provider>节点 - 找到
<system.data>下的<DbProviderFactories>,移除对应<add>节点
- 找到
- 如果是全局配置里的注册导致的,可以在项目配置里先移除再注册你需要的Provider,比如:
<system.data> <DbProviderFactories> <!-- 先移除不想用的Provider --> <remove invariant="你要排除的Provider名称" /> <!-- 再注册你需要的(比如后面要用到的PostgreSQL驱动) --> <add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data> - 最后确保卸载掉项目中相关的NuGet包(比如你之前用的
EntityFramework.SqlServerCompact.Legacy),避免残留引用
问题2:从SqlServerCe 3.5 + EF6迁移到PostgreSQL
这个迁移需要替换驱动、修改配置、更新连接字符串,具体步骤如下:
1. 安装PostgreSQL的EF6驱动
先卸载原来的EntityFramework.SqlServerCompact.Legacy包,然后通过NuGet安装PostgreSQL的EF6适配包:
Install-Package Npgsql.EntityFramework6
(这个包会自动帮你添加必要的引用和基础配置,省不少事)
2. 修改配置文件
你原来的EF配置是这样的:
把它替换成PostgreSQL对应的配置:
<entityFramework> <!-- 替换默认连接工厂为PostgreSQL的 --> <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, Npgsql.EntityFramework6" /> <providers> <!-- 注册PostgreSQL的EF6 Provider --> <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework6" /> </providers> </entityFramework>
另外,如果安装包没自动添加<system.data>的配置,手动加上:
<system.data> <DbProviderFactories> <remove invariant="Npgsql" /> <!-- 防止重复注册报错 --> <add name="Npgsql Data Provider" invariant="Npgsql" description=".NET Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" /> </DbProviderFactories> </system.data>
3. 更新连接字符串
把原来的SqlCe连接字符串换成PostgreSQL格式,比如:
原SqlCe连接字符串:
<connectionStrings> <add name="YourDbContextName" connectionString="Data Source=YourDb.sdf" providerName="System.Data.SqlServerCe.3.5" /> </connectionStrings>
修改后:
<connectionStrings> <add name="YourDbContextName" connectionString="Server=localhost;Port=5432;Database=你的数据库名;User Id=postgres;Password=你的密码;" providerName="Npgsql" /> </connectionStrings>
4. 数据迁移与适配
- 如果要保留原有数据,可以用SqlCe工具(比如SqlCeToolbox)导出数据,再导入到PostgreSQL数据库
- 检查你的实体类映射,确保和PostgreSQL兼容:比如主键自增用
[DatabaseGenerated(DatabaseGeneratedOption.Identity)],Npgsql驱动会自动适配PostgreSQL的自增列(serial/identity) - 打开Package Manager Console,运行
Enable-Migrations(如果之前没启用迁移),然后Add-Migration InitialPostgres生成迁移脚本,最后Update-Database创建PostgreSQL的数据库结构
内容的提问来源于stack exchange,提问作者doodoroma
相关产品推荐
相关产品推荐

