7

我已经看到讨论使用官方说明的实体框架和 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);
    }
}

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

无法确定“Npgsql.NpgsqlConnection”类型连接的提供程序名称。

我应该怎么办?

4

1 回答 1

4

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

当您为数据库(MySQL、PostgreSQL 等)安装 ADO.NET 提供程序时,安装程​​序通常会在 GAC 中注册提供程序程序集并将一个条目添加到machine.config. 如果您想在无需安装提供程序的情况下进行部署,则需要包含提供程序程序集的副本(将 Npgsql 程序集引用设置为项目的 Copy Local)并向您的应用程序添加一个条目,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>

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

于 2012-08-20T06:49:04.407 回答