无法首先使用Npgsql和Entity Framework代码在PostreSQL中创建数据库

我正在尝试设置我的应用程序以使用Entity Framework和PostgreSQL,但我遇到了一个问题。 我已经通过nuget添加了Npqsql,并将以下提供程序工厂添加到web.config

      

使用连接字符串:

   

它似乎很好地连接到数据库,但当我尝试在数据库上执行任何类型的操作时,我得到以下exception:

FATAL: 3D000: database "withoomph" does not exist

当db设置如下时,我正在正确设置数据库intitializer:

 static MyDB() { Database.SetInitializer(new CreateDatabaseIfNotExists()); } 

所以当我尝试用我的DbContext做任何事情时,它应该只是简单地创建db? 我不明白,整个早上都拔我的头发!

不幸的是,Npgsql没有(截至目前)自动模式创建代码优先。

您可以先创建数据库,然后连接到它。

更新(2016):Npgsql 3现在首先实现数据库创建代码。 确保通过代码或XML设置配置正确的连接工厂以使用NpgsqlConnection ,并使用适当的连接字符串 。

毫不奇怪,由于尚未创建数据库withoomph ,因此您不能使用Database=withoomph;连接字符串Database=withoomph; 提到了。

您可以做的是使用createdbpsql手动创建此数据库,或临时更改您的连接字符串以使用Database=postgres; 代替。

这应该有效,因为在所有最近的PostgreSQL版本数据库中, postgres保证在vanilla安装之后存在,并且应该仅用于此目的 – 获取初始认证连接以创建另一个数据库并发出CREATE DATABASE withoomph; 在您的申请中。

但是,在创建新数据库之后,应立即断开与postgres连接,连接到新的withoomph并继续正常运行。

除了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(); } }