6

我正在尝试设置我的应用程序以将 Entity Framework 与 PostgreSQL 一起使用,但我遇到了一个问题。我已Npqsql通过 nuget 添加,并将以下提供程序工厂添加到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

当数据库设置如下时,我正在正确设置数据库初始化程序:

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

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

4

3 回答 3

9

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

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

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

于 2013-02-06T21:08:35.803 回答
4

毫不奇怪,由于您的数据库withoomph尚未创建,因此您不应该在Database=withoomph;提到的地方使用连接字符串。

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

这应该可以工作,因为在所有最新的 PostgreSQL 版本上,数据库postgres在 vanilla 安装后都保证存在,并且应该仅用于此目的 - 获取初始经过身份验证的连接以创建另一个数据库并CREATE DATABASE withoomph;在您的应用程序中发布。

但是,在创建新数据库后,您应该立即断开连接postgres,连接到新数据库withoomph并正常继续。

于 2013-01-18T07:32:38.540 回答
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();
    }
}
于 2015-03-10T09:29:50.720 回答