【问题标题】:postgresql does not appear in Data Source when generating .ADO.net Entity Data Model生成 .ADO.net 实体数据模型时,postgresql 不会出现在数据源中
【发布时间】:2015-11-09 19:44:13
【问题描述】:

我通过直接使用 npgsql 成功访问了现有的 postgresql 数据库。我用这个:

  1. PostgreSQL 9.0.10(32 位)
  2. Visual Studio 2015 社区(64 位)
  3. NpgSql 2.2.5(通过管理 Nuget 包)

然而,dbase 有 25 多个表和 400 多个列,因此我的意图是使用实体框架 + .ADO.net 实体数据模型来避免必须对所有列进行代码访问。我搜索并尝试了这个站点上的所有内容,npgsql 站点http://www.npgsql.org/doc/ddex.html,...但我没有成功生成 .ADO.net 实体数据模型,因为 postgresql 没有出现在数据源中。

我用于这个:

  1. PostgreSQL 9.0.10(32 位)
  2. Visual Studio 2015 社区(64 位)
  3. NpgSql 2.2.5(通过管理 Nuget 包)
  4. Setup_Npgsql-2.2.5.0-r3-net45.exe(来自 GitHub,因为某些网站 表示要求在 GAC 中具有相同的版本 作为visual studio项目中使用的包;我没有拿版本 3.0.0 因为 Github 缺少安装文件)。
  5. Npgsql.entityframework6 2.2.5(通过管理 Nuget 包)
  6. Entityframework 6.1.3(通过管理 Nuget 包)

在尝试生成 .ADO.net 实体数据模型时,我该怎么做才能使 postgresql 显示为数据源?
还是 Visual Studio 2015 社区不允许为 postgresql 生成 .ADO 网络实体数据模型?

编辑 我添加了以下信息,希望得到回复:

使用 Microsoft Windows 8.1 6.3.9600 build 9600 64 位

提取“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config”

<system.data>
    <DbProviderFactories>
        <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF" />
    </DbProviderFactories>
</system.data>

提取“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config”

<system.data>
    <DbProviderFactories>
        <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.2.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF" />
    </DbProviderFactories>
</system.data>

“Visual Studio - packages.config”

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net452" />
  <package id="Npgsql" version="2.2.5" targetFramework="net452" />
  <package id="Npgsql.EntityFramework" version="2.2.5" targetFramework="net452" />
</packages>

“Visual Studio - App.config”

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <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" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

【问题讨论】:

  • 我在 VS 2015 中遇到了同样的问题,我做了与你几乎相同的事情,但我无法让 postgres 出现。我什至安装了 dotConnect express 版本的 postgres,但没有成功。
  • 我能理解你,但我仍然有这个问题。作为 C# 中的初学者,我对此无能为力。我想我别无选择,然后继续学习/尝试最终发现一些明显的东西。
  • 这让我做了好几个星期的噩梦。祝你好运。我最终通过创建一大堆函数来执行我的数据操作来解决它。
  • 大家好——我在使用 npgsql 时也没有看到数据提供者。你们中的任何一个人都设法找到了解决方案——如果你能发布结果,全世界都会非常感激。克里斯

标签: c# postgresql entity-framework-6 visual-studio-2015 npgsql


【解决方案1】:

由于同样的问题,我在 3 天后感到困惑。

但是,我发现解决了这个问题:

  1. 在您的 Visual Studio 环境中安装 .vsix 文件。 https://github.com/npgsql/npgsql/releases/tag/v3.1.8 (NpgsqlDdexProvider)

  2. 通过 Nuget 包管理器安装 Npgsql 和 EntityFramework6.Npgsql。

  3. 构建您的项目。 (用于应用 Nuget 修改的 App.xaml 的配置)

  4. 您可以使用 ADO.NET 实体模型生成。

此外,dotConnect 不支持 Express 版本中的实体模型。它仅在商业版本中支持。

但是目前,Npgsql 已经立即关闭了 EDM 中的 bug。所以,我找到了解决方案。

【讨论】:

  • 构建步骤很关键!
【解决方案2】:

我有一段时间遇到同样的问题。然后,我尝试安装 dotconnect https://www.nuget.org/packages/dotConnect.Express.for.PostgreSQL/7.4.506/。而且,它有效!希望对您有所帮助。

【讨论】:

    【解决方案3】:

    可以通过添加此处提供的 Visual Studio 扩展来解决此问题:http://www.npgsql.org/doc/ddex.html

    【讨论】:

      【解决方案4】:

      这在 VS2017 中困扰了我几个小时。我手动玩了app.config 设置,没有任何乐趣。为我修复它的步骤是:

      1. 从我想使用的 npgsql 版本安装 Npgsql.vsix from here
      2. 删除 nuget 包 EntityFrameworkNpgsqlEntityFramework6.Npgsql
      3. 删除app.config 中对这些包的任何引用的块 包括entityFrameworkassemblyBindings
      4. 按顺序重新安装上面的 nuget 包
      5. 重建

      编辑

      我还必须将以下内容添加到 app.config 才能成功运行 Enable-Migrations

      <system.data>
        <DbProviderFactories>
            <remove invariant="Npgsql"/>
            <add name="Npgsql Data Provider" invariant="Npgsql" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF"/>
        </DbProviderFactories>
      </system.data>
      

      【讨论】:

        【解决方案5】:

        在 VS 2019 中

        使用 NuGet 安装“PostgreSQL provider for Entity Framework 6”包。 您不需要安装任何其他东西,Npgsql 已包含在包中。

        注意事项:

        • 该软件包仅适用于当前项目,必须使用新项目重新安装,机器范围内没有安装任何内容。

        • 不要混合为您的应用程序安装提供程序包(这里要解决的问题)和安装称为“Visual Studio 集成”(Npgsql.vsix) 的 Visual Studio 扩展,以便 VS 可以打开 PostgreSQL 数据库(例如在服务器浏览器中)。

        为 EF6 安装 PostgreSQL 提供程序

        1. 创建一个空白项目或使用现有项目
        2. 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet 包
        3. 搜索 EntityFramework6.NpgSql 包(Shay Rojansky...),当前为 3.2.0
        4. 选择您的新项目并点击安装

        (如果您愿意,可以使用 PM 命令并输入Install-Package EntityFramework6.Npgsql -Version 3.2.0

        如果出现 Factory not found 异常

        由于某种原因,您在执行应用程序时可能会收到异常,因为 .NET 找不到提供程序工厂:

        具有不变名称“Npgsql”的 ADO.NET 提供程序不是 在机器或应用程序配置文件中注册,或无法注册 加载。有关详细信息,请参阅内部异常。在 system.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName)

        在我的例子中,在App.config 中添加这个解决了这个问题:

        <system.data>
          <DbProviderFactories>
            <remove invariant="Npgsql"/>
            <add invariant="Npgsql" name="Npgsql Data Provider" description=".Net Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" support="FF"/>
          </DbProviderFactories>
        </system.data>
        

        如果有人可以解释为什么上面的部分丢失了......

        现在您应该能够使用 ADO.NET 实体数据模型向导为 PostgreSQL 生成派生 DbContext。


        安装详情,仅供参考

        这会将文件复制到项目的子目录package 并引用它们:

        • Npgsql.4.0.2
        • EntityFramework.6.2.0(微软)
        • EntityFramework6.Npgsql.3.2.0
        • System.Threading.Tasks.Extensions.4.5.0
        • System.Runtime.CompilerServices.Unsafe.4.5.0
        • System.ValueTuple.4.5.0

        这也会在应用配置文件App.config中创建条目:

        <configSections>
          <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </configSections>
        
        <entityFramework>
          <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
              <parameter value="mssqllocaldb" />
            </parameters>
          </defaultConnectionFactory>
        
          <providers>
            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
            <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
          </providers>
        </entityFramework>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-06
          • 2013-01-04
          • 1970-01-01
          • 2010-12-10
          • 2018-01-07
          • 2017-11-02
          • 2011-05-01
          相关资源
          最近更新 更多