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

时间:2013-01-17 12:37:00

标签: c# entity-framework postgresql npgsql

我正在尝试设置我的应用程序以使用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做任何事情时,它应该只是创建数据库吗?我不明白,整个早上都拔头发了!

3 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:4)

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

您可以使用createdbpsql手动创建此数据库,或暂时更改连接字符串以使用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();
    }
}