我正在尝试设置我的应用程序以使用PostgreSQL实现Entity Framework,但我遇到了一个问题。我已经通过nuget添加了Npqsql
,并将以下提供商工厂添加到web.config
:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
description=".Net Framework Data Provider for Postgresql Server"
type="Npgsql.NpgsqlFactory, Npgsql,
Version=2.0.12.0, Culture=neutral,
PublicKeyToken=5d8b90d52f46fda7" />
</DbProviderFactories>
</system.data>
使用连接字符串:
<add name="MyDb" providerName="Npgsql"
connectionString="Server=localhost;Port=5432;Database=withoomph;User ID=postgres;Password=******;enlist=true" />
似乎连接到数据库很好,但是当我尝试对数据库执行任何类型的操作时,我得到以下异常:
FATAL: 3D000: database "withoomph" does not exist
当db设置如下时,我正确设置数据库intitializer:
static MyDB()
{
Database.SetInitializer<MyDB>(new CreateDatabaseIfNotExists<MyDB>());
}
所以当我尝试对DbContext
做任何事情时,它应该只是创建数据库吗?我不明白,整个早上都拔头发了!
答案 0 :(得分:9)
不幸的是,Npgsql没有(截至目前)自动模式创建代码优先。
您可以先创建数据库,然后连接到它。
更新(2016):Npgsql 3现在首先实现数据库创建代码。确保通过代码或XML设置配置正确的连接工厂以使用NpgsqlConnection
,并使用适当的Connection String。
答案 1 :(得分:4)
毫不奇怪,由于您的数据库withoomph
尚未创建,因此您无法使用提及Database=withoomph;
的连接字符串。
您可以使用createdb
或psql
手动创建此数据库,或暂时更改连接字符串以使用Database=postgres;
。
这应该有效,因为在所有最近的PostgreSQL版本中,数据库postgres
保证在vanilla安装之后存在,并且应该仅用于此目的 - 获取初始认证连接以创建另一个数据库并发出CREATE DATABASE withoomph;
在你的申请中。
但是,在创建新数据库后,您应立即与postgres
断开连接,连接到新withoomph
并继续正常运行。
答案 2 :(得分:2)
除了mvp的回答,这里还有我用来创建数据库的代码片段。您需要在初始化EF之前运行它。 因此,诀窍是暂时将数据库名称切换为'postgres',保证在安装vanilla之后存在。
public void CreateDatabase(string connectionString)
{
var builder = new NpgsqlConnectionStringBuilder(connectionString);
var databaseName = builder.Database; // REMEMBER ORIGINAL DB NAME
builder.Database = "postgres"; // TEMPORARILY USE POSTGRES DATABASE
// Create connection to database server
using (var connection = new NpgsqlConnection(builder.ConnectionString))
{
connection.Open();
// Create database
var createCommand = connection.CreateCommand();
createCommand.CommandText = string.Format(@"CREATE DATABASE ""{0}"" ENCODING = 'UTF8'", databaseName);
createCommand.ExecuteNonQuery();
connection.Close();
}
}