6

PostgreSQL で Entity Framework を使用するようにアプリケーションをセットアップしようとしていますが、問題が発生しました。Npqsqlnuget 経由で追加し、次のプロバイダー ファクトリを に追加しました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" />

DB に問題なく接続しているようですが、DB で何らかのアクションを実行しようとすると、次の例外が発生します。

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

データベースが次のように設定されている場合、データベース初期化子を正しく設定しています。

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

DbContextそれで、私が自分の権利で何かをしようとすると、単純にdbを作成する必要がありますか? わからない、朝からずっと髪を引っ張ってる!

4

3 に答える 3

9

残念ながら、Npgsql には (現時点では) 自動スキーマ作成コード ファーストがありません。

最初にデータベースを作成してから、それに接続できます。

更新 (2016): Npgsql 3 は、データベース作成コード ファーストを実装するようになりました。NpgsqlConnectionコードまたは XML 設定を介して sを使用するように正しい接続ファクトリを構成し、適切な接続文字列を使用していることを確認してください。

于 2013-02-06T21:08:35.803 に答える
4

当然のことながら、データベースwithoomphはまだ作成されていないため、Database=withoomph;言及されている接続文字列を使用することはできません。

できることは、またはを使用してこのデータベースを手動で作成するかcreatedbpsql接続文字列を一時的に変更してDatabase=postgres;代わりに使用することです。

最近のすべての PostgreSQL バージョンpostgresでは、バニラのインストール後にデータベースが存在することが保証されており、この目的のためだけに使用する必要があるため、これは機能するはずです。つまり、最初の認証された接続を取得して別のデータベースを作成CREATE DATABASE withoomph;し、アプリケーション内で発行します。

ただし、新しいデータベースが作成されたら、すぐに から切断し、新しいデータベースpostgresに接続して、withoomph通常どおり続行する必要があります。

于 2013-01-18T07:32:38.540 に答える
2

mvp の回答に加えて、データベースの作成に使用したコード スニペットを次に示します。EF を初期化する前に実行する必要があります。したがって、トリックは、データベース名を一時的に「postgres」に切り替えることです。これは、バニラのインストール後に存在することが保証されています。

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 に答える