如何使用Entity Framework连接到PostgreSQL

时间:2015-11-04 17:09:22

标签: c# entity-framework postgresql npgsql

使用EntityFramework for C#连接到远程PostgreSQL数据库时遇到问题。我可以使用pgAdmin,“SQL Manager for PostgreSQL”(来自EMS,www.pgsqlmanager.com)和经典的NpgsqlConnection(我可以读取数据并使用sqlcommands来插入/修改/删除数据)来连接数据库。

但是当我尝试使用EntityFramework时,我收到了消息:

“提供程序未返回ProviderManifestToken字符串。”
“致命:28000:没有pg_hba.conf条目为主机\”... \“,用户\”... \“,数据库\”... \“,SSL关闭”

我在“http://www.elephantsql.com/docs/appharbor.html”上尝试过这个解决方案但是没有用。在“return ManifestToken”上放置一个断点表明,即使执行了“this.AddDependencyResolver(...)”,也不会执行此代码。

连接打开,因为“(我的上下文实例).Database.Connection.Open();”不会抛出任何异常。

我已尝试使用以下软件包/库组合的代码:

  • Npgsql 2.2.7 / Npgsql.EntityFrameworkLegacy 2.2.7 / EntityFramework 4.3.1
  • Npgsql 2.2.7 / Npgsql.EntityFrameworkLegacy 2.2.7 / EntityFramework 5.0.0
  • Npgsql 2.2.7 / Npgsql.EntityFramework 2.2.7 / EntityFramework 6.1.3
  • Npgsql 3.0.3 / EntityFramework6.Npgsql 3.0.3 / EntityFramework 6.1.3

以上都没有(PostgreSQL服务器是8.3)。

代码适用于复制的MySql远程数据库。

我的猜测是,有些PostgreSQL库试图查询服务器的受限区域,不应该。其他客户完美无缺地工作。

部分代码:

// This work
using (MyContextClass dbInstance = new (MyContextClass(new NpgsqlConnection(pgConnectionString))))
{
    dbInstance.Database.Connection.Open();
    dbInstance.Database.Connection.Close();
    using(NpgsqlConnection pgCon = new NpgsqlConnection(dbInstance.Database.Connection.ConnectionString))
    {
        using(DataTable dt = new DataTable())
        {
            using(NpgsqlDataAdapter pgAdapter = new NpgsqlDataAdapter("select * from someTable", pgCon))
            {
                pgTeste.Open();

                pgAdapter.Fill(dt);

                pgTeste.Close();

                Assert.IsTrue(dt.Rows.Count > 1); // ok
            }
        }
    }    
}

// This doesn't

using (MyContextClass dbInstance = new (MyContextClass(new NpgsqlConnection(pgConnectionString))))
{
    var lst = dbInstance.SomeTableDataSet.ToList(); // Throws exception!!!
}

// This works perfectly

using (MyContextClass dbInstance = new (MyContextClass(new MySqlConnection(myConnectionString))))
{
    var lst = dbInstance.SomeTableDataSet.ToList();

    Assert.IsTrue(lst.Count > 1); // ok
}

0 个答案:

没有答案