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

7

我已经看到了一些关于使用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);
    }
}

但是使用这种方法我得到了一个NotSupportedException(不支持的操作异常),并显示以下消息:

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


我该怎么做?
1个回答

4
您需要在app/web.config中注册Npgsql提供程序。请参阅Npgsql手册的第3.4节“使用ProviderFactory的Npgsql”部分。
当您安装用于数据库的ADO.NET提供程序(MySQL、PostgreSQL等)时,安装程序通常会将提供程序程序集注册到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>

请确保版本号与您部署的Npgsql程序集的版本完全匹配(或者只需省略Version/Culture/PublicKeyToken)。<Clear />是为了避免在运行时与已经存在于machine.config中的Npgsql条目发生冲突。如果没有清除,则会出现异常。但是,这也假定您的应用程序不依赖于machine.config中指定的任何其他提供程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接