如何从连接中使用Entity Framework + PostgreSQL?

mel*_*lmi 7 npgsql entity-framework-4 postgresql-9.1

我已经看到线程讨论使用Entity Framework和PostgreSQL与官方指令.这些指令需要gacutil针对每个安装运行,这对于部署目的而言并不那么方便.

我想要做的是将PostgreSQL连接直接传递给DbContext构造函数.这对我来说已经足够了,因为我将在CodeFirst没有设计师的情况下使用.这就是我做的:

public class Context : DbContext
{
    Context(System.Data.Common.DbConnection connection)
        : base(connection, true)
    {
    }

    public static Context CreateContext()
    {
        NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=********;Database=xxx;");
        conn.Open();

        return new Context(conn);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是使用这种方法,我收到了一条NotSupportedException消息:

无法确定连接类型为"Npgsql.NpgsqlConnection"的提供程序名称.

我该怎么办?

Sco*_*rch 4

您需要在app/web.config. 请参阅Npgsql 手册的第3.4 节将 Npgsql 与 ProviderFactory 结合使用。

当您安装数据库(MySQL、PostgreSQL 等)的 ADO.NET 提供程序时,安装程​​序通常会在 GAC 中注册提供程序程序集并向machine.config. 如果您想在不安装提供程序的情况下进行部署,则需要包含提供程序程序集的副本(将项目的 Npgsql 程序集引用设置为“复制本地”),并向应用程序添加一个条目,如下所示app/web.config

<configuration>
  ...
  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
    </DbProviderFactories>
  </system.data>
  ...
</configuraiton>
Run Code Online (Sandbox Code Playgroud)

确保版本与您部署的 Npgsql 程序集的版本完全匹配(或者只是省略 Version/Culture/PublicKeyToken)。如果<Clear />在其machine.config. 如果没有明确的说明,您将得到例外。但是,这还假设您不依赖于machine.config您的应用程序中指定的任何其他提供程序。