将 npgsql 配置为与 .NET 3.5 和 EF 一起使用
Posted
技术标签:
【中文标题】将 npgsql 配置为与 .NET 3.5 和 EF 一起使用【英文标题】:Configure npgsql to use with .NET 3.5 and EF 【发布时间】:2015-10-04 12:27:06 【问题描述】:我正在开发一个应用程序,它使用与 .NET 框架 3.5(不是更新版本)一起使用的第三方库。我的应用是WPF,需要使用EntityFramework来连接Postgre SQL数据库。
我搜索了一下,发现最流行的连接 Postgre 的方法是使用 npgsql 提供程序。
所以,我尝试从他们的网站安装 npgsql,然后发现 exe 安装程序只为 .NET 4.0 和 4.5 安装 npgsql。它还为 Visual Studio 安装了 vsix 扩展,它工作得很好。我必须下载 .NET 3.5 的 npgsql 库并手动添加对 Npgsql.dll 和 Npgsql.EntityFrameworkLegacy.dll 的引用。
我还将我的应用程序目标框架设置为 3.5,并使用 Nuget 安装 EntityFramework(4.1.10715 是与 .NET 3.5 配合使用的最新版本)。
然后我能够使用 edmx 向导(它检测到我的 Entityframework 设置为“3.5”)连接到数据库并生成 edmx 和一些类。
所以,问题是,当我尝试在我的应用程序中获取一些数据时:
using (var db = new Entities())
var list = db.MyItems.ToList()
它总是因错误而失败:
在配置中找不到指定的商店提供者,或者 无效。
我这样配置了我的 App.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
</providers>
</entityFramework>
<startup>
<supportedRuntime version="v2.0.50727" />
</startup>
<connectionStrings>
<add name="myEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=Npgsql;provider connection string="PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;COMPATIBLE=2.2.5.0;DATABASE=mydb;HOST=localhost;PASSWORD=postgres;USER ID=postgres"" providerName="System.Data.EntityClient" />
</connectionStrings>
我认为我应该更改我的 App.config 中的某些内容,但无法找出问题所在。
请帮忙。
【问题讨论】:
【参考方案1】:缺少商店提供商。 商店提供者通常是 ADO.Net 提供者。通常在 machine.config 中注册,但在您的情况下可能不是。 当我部署应用程序时,我将其插入 App.Config 以避免修改 machine.config 但您需要在输出目录中有提供程序(因此请务必在编译期间复制它)。 反正我在App.config中使用了这段配置(在配置中插入)
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"
support="FF" />
</DbProviderFactories>
</system.data>
【讨论】:
谢谢!用 type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" 稍微编辑了你的答案,因为这对我来说很重要。 奇怪的东西。我仔细检查了两个 machine.config(32 位和 64 位)文件,提供程序在那里,代码几乎相同。 我碰巧找不到注册的提供者。这就是为什么在部署中我将它添加到 App.Config 中。要测试 machine.config 中的注册是否有效,您还可以使用 DbProviderFactories 类来避开 EF 层。以上是关于将 npgsql 配置为与 .NET 3.5 和 EF 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将代码从 .net 4.0 回滚到 .net 3.5,现在动态不起作用
ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库(问题总结)
无法从 .NET 应用程序 (Npgsql) 连接到 Heroku Postgres