将 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=&quot;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&quot;" 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

Npgsql 按名称将参数传递给存储的函数

Npgsql .net 版本的PostgreSQL数据库连接字符串及参数

Npgsql .net 版本的PostgreSQL数据库连接字符串及参数