Postgres Datenbank und Entity Framework mit npgsql


Auch der Zugriff auf eine Postgres Datenbank ist mit Hilfe des Entity Framework “problemlos” möglich. Man findet auch ein paar gute Anleitungen im Netz, an die Ich mich ebenfalls gehalten habe, aber auch da traten Probleme auf und daher eine kurze Anleitung von mir wie man auf eine Postres Datenbank mit Hilfe des Entity Frameworks zugreifen kann. Ich habe bisher keine Möglichkeit gefunden das ganze über die grafische Oberfläche des Visual Studios einzubinden, d.h. Ihr müsst mit der Konsole arbeiten, wenn hier jemand eine bessere Möglichkeit kennt bin ich über jeden Tipp dankbar.

Das Tool gacutil

Als erstes benötigt man den passenden Npgsql – Data Provider, welcher die Schnittstelle zur Postgressql Datenbank darstellt. Dieser kann hier heruntergeladen werden (Homepage), hier darauf achten das Ihr den neuesten Provider Herunterladet bei mir war dies z.B. “Npgsql2.0.11.92-bin-ms.net4.0.zip” für .NET 4.0. Die Datei entpacken und dann mit Hilfe des “gacutil.exe” dem Globalen Assembly Cache die beiden entpackten Dateien “Npgsql.dll” und “mono.security.dll” hinzufügen/registrieren:

gacutil -i c:\temp\npgsql.dll
gacutil -i c:\temp\mono.security.dll

Hier hatte ich zuerst Probleme das richtige gacutil Programm zu finden, denn die Version die unter:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\

zu finden ist, war bei mir nicht mit den dlls kompatibel (war nicht aktuell genug) die ich registrieren wollte, aber es gibt noch eine “gacutil.exe” unter:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\

und mit dieser Version hat alles problemlos funktioniert und meine beiden dlls wurden dem GAC hinzugefügt. Da wir gleich noch die Assembly Version und das PublicKeyToken von “npgsql.dll” benötigen, können wir das direkt noch mit “gacutil” ermitteln:

gacutil -l npgsql

image

Die Machine.config

Nach dem wir das erledigt haben, müssen wir unseren neuen Provider noch in der “machine.config” hinzufügen unter (je nachdem auf welchem System wir arbeiten bei einem 64Bit System das Framework64 Verzeichnis verwenden.):

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\

oder

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\

in der “machine.config” muss nach dem Abschnitt “DbProviderFactories” gesucht werden und der folgende Eintrag wird hinzugefügt:

<add name=“Npgsql Data Provider“ invariant=“Npgsql“  support=“FF“ description=“.Net Framework Data Provider for Postgresql Server“ type=“Npgsql.NpgsqlFactory, Npgsql, Version=2.0.11.92, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7″ /></DbProviderFactories>

hier nicht vergessen die passende Version und das passende PublicKeyToken einzutragen.

Das Tool EdmGen

Als nächstes erstellen wir mit der Hilfe des Tools “EdmGen.exe” ein passendes Entity Framework Metadaten Schema. Die “EdmGen.exe” findet man in der jeweiligen Framework Version für die man das Schema erstellen möchte und für die man das passende “nqgsql” heruntergeladen hat. Wenn man den “npgsql” Provider nicht richtig in der “machine.config” hinzugefügt hat, kommt es hier zu einem Fehler, das er den Provider nicht finden kann. Das Tool “EdmGen.exe” findet man z.B. unter (je nachdem um was für ein System es sich bei euch handelt):

C:\Windows\Microsoft.NET\Framework\v4.0.30319\

oder

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

mit dem folgenden Befehl erstellt man dann die passenden Schema und C# Dateien:

edmgen /mode:FullGeneration /project:PostgreSQL /provider:Npgsql /connectionstring: ”Server=localhost;Port=5432;UserId=postgres;Password=************;Database=testDb”

Achtung die Dateien werden direkt im “v4.0.30319” Verzeichnis abgelegt und wenn man die falsche Version der “npgsql.dll” für eine andere Framework Version heruntergeladen hat, dann kommt es hier zu einem Fehler, also aufpassen wenn man den Data Provider herunterlädt für welche .NET Version dieser gedacht ist.

ACHTUNG: Beim Kopieren des Strings aus dem Browser und einfügen in der Kommandozeile gibt es Probleme mit den Anführungszeichen, daher am besten den String abschreiben. Das gleiche gilt auch für den String in der machine.config!

Datenmodell in das Visual Studio Projekt einbinden

Es sollten jetzt die folgenden fünf Dateien mit im Hauptverzeichnis liegen wo sich “edmgen” befindet: “PostGreSQL.csdl”, “PostGreSQL.msl”, “PostGreSQL.ssdl”, “PostGreSQL.Objectlayer.cs”, “PostGreSQL.Views.cs” – diese wurden durch “edmgen” erstellt und man kopiert alle fünf Dateien in sein Visual Studio Projekt. (In meinem Falle erst einmal eine einfache Konsolenanwendung)

image

Die Dateinamen enthalten den “project” Namen den wir im “edmgen” Tool Befehl angegeben haben. Die beiden C# Dateien werden verwendet um auf das Datenmodell zuzugreifen und die *.csdl, *.msl und *.ssdl werden im Connectionstring benötigt für die Metadaten. Außerdem muss bei diesen drei Dateien in den Eigenschaften eingestellt werden, das diese mit in das Ausgabeverzeichnis kopiert werden sollen, damit diese vom Connectionstring auch gefunden werden können.

image

In der “App.config” fügen wir dann unseren Connectionstring hinzu:

image

Wichtig ist das wir “metadata=.;” angeben, das bedeutet er soll die Metadaten Dateien im aktuellen Verzeichnis suchen und da diese auch mit in das Ausgabeverzeichnis kopiert werden funktioniert alles, ohne das man den Connectionstring selbst auslesen muss. Wichtig ist noch das man die “&quot” angibt, sonst kommt es auch hier zu einem Fehler. Dann muss noch der Name des Connectionstrings in der “App.config” dem Namen entsprechen der in der “PostGreSQL.Objectlayer.cs” im Konstruktor steht, in meinem Fall “PostGreSQLContext”, dann wird beim Erstellen des Contexts gleich der richtige Connectionstring genommen. (für EF 4.1 wie man auch einen ConnectionString übergeben kann findet Ihr hier)

image

Dann noch als Verweis unserem Projekt die “Npgsql.dll” und “mono.security.dll” hinzufügen und einstellen das diese mit in das Ausgabeverzeichnis kopiert werden sollen, evtl. fehlt noch der ein oder andere Verweis, hier einfach mal bei Google nachschlagen.

Initialisieren unseres Contexts und Hinzufügen eines neuen Mitarbeiters sowie Abfragen aller Mitarbeiter aus der Postgres Datenbank:

image

Das war es dann schon, jetzt kann man problemlos mit Hilfe vom Entity Framework auf die Prostgres SQL Datenbank zugreifen.

Die meisten Probleme hatte ich mit dem Connectionstring und den Metadatenangaben, also hier bitte besonders aufpassen.

Update:

Wenn man das ganze dann in einem Programm ausliefern möchte, darf man nicht vergessen die npgsql Bibliotheken mit beizulegen und in der app.config den dbProvider einzutragen, den wir weiter oben bereits in unserer lokalen machine config eingetragen haben.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.data>
  <DbProviderFactories>
    <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.11.92, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
  </DbProviderFactories>
</system.data>
</configuration>
Advertisements

4 Gedanken zu „Postgres Datenbank und Entity Framework mit npgsql

  1. Berti

    Vielen Dank für die tolle Anleitung! Bei mir hat es allerdings eine Weile gedauert bis es funktioniert hat, da die Metadaten nie gefunden werden konnten.
    Ich bekam immer folgende Fehlermeldung „The specified default EntityContainer name [name] could not be found in the mapping and metadata information“.

    Das Problem hat sich gelöst als ich den connectionstring in der web.config etwas umschrieb. Anstatt connectionString=“metadata=.; …“
    habe ich das hier geschrieben:
    connectionString=“metadate=~; …“

    Funktioniert die Verbindung!

    Gefällt mir

    Antwort
  2. knut wehrle (@kwrl)

    Klasse Anleitung .. ich hatte die Hoffnung auf den Einsatz von PostgreSQL schon fast aufgegeben.

    Meine EF-Klassen sind im Unterverzeichnis „models“ (Web API-Application) ; deshalb bei mir „metadata=~/models;…“ und hat dann auch sofort funktioniert.

    Danke nochmal!

    Gefällt mir

    Antwort
  3. Pingback: Entity Framework 6 provider wechsel–MSSQL und PostGreSql 2.1.1.0 | SquadWuschel's Blog

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s