如何从连接中使用实体框架+ PostgreSQL?
我已经看到线程讨论使用实体框架和PostgreSQL的官方说明。 这些说明需要为每次安装运行gacutil
,而这对于部署而言并不那么方便。
我想在这里做的是将PostgreSQL连接直接传递给DbContext
构造函数。 这对我来说已经足够了,因为我将在没有设计CodeFirst
情况下使用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'的连接的提供者名称。
我该怎么办?
您需要在app/web.config
注册Npgsql提供app/web.config
。 请参见3.4使用Npgsql与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>
确保版本与您部署的Npgsql程序集的版本完全匹配(或只是省略Version / Culture / PublicKeyToken)。 如果在已经在machine.config
输入了Npgsql的计算机上运行,则可以使用<Clear />
来避免冲突。 没有明确的你会得到一个例外。 但是,这也假设您不依赖machine.config
为应用程序指定的任何其他提供程序。
上一篇: How to use Entity Framework + PostgreSQL from connection?