2013-02-04 6 views
9

Ich versuche, EF 5.0-Code zuerst mit PostgreSQL (Npgsql-Anbieter) zu arbeiten. Ich habe Npgsql 2.0.12.1 über NuGet installiert (referenzierte Assembly ist 2.0.12.0). Ich habe Npgsql in app.config erklärt (beide Standardverbindung Fabrik und Anbieter ab Werk): Entity Framework 5.0 PostgreSQL (Npgsql) Standard-Verbindungsfactory

[Test] 
public void DatabaseConnection_DatabaseFactoryTest() 
{ 
    var factory = DbProviderFactories.GetFactory("Npgsql"); 
    var conn = factory.CreateConnection(); 
    conn.ConnectionString = _connectionString; 
    var npg = (NpgsqlConnection)conn; 
    var result = TestConnectionHelper(npg); // scalar select version(), nothing particular 
    Assert.AreEqual(result, "PostgreSQL 9.2.2, compiled by Visual C++ build 1600, 64-bit");    
} 

Das bedeutet zumindest Datenbankinstanz läuft und Anbieter

:

<entityFramework> 
    <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
</entityFramework> 
<system.data> 
     <DbProviderFactories> 
      <add name="Npgsql Data Provider" 
       invariant="Npgsql" 
       description="Data Provider for PostgreSQL" 
       support="FF" 
       type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/> 
     </DbProviderFactories> 
</system.data> 

ich folgenden Test erfolgreich ausgeführt habe ist erfolgreich konfiguriert. Nun, was ich will, ist benutzerdefinierten Datenbankkontext von DbContext geerbt zu verwenden, die über Verbindungszeichenfolge zu gleiche Provider und initialisiert gebunden werden:

public class InventoryContext : DbContext 
{ 
    public InventoryContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 
    // mappings and properties, cut for conciseness 
} 

Nach Test nicht bestanden:

[Test] 
public void DatabaseConnection_DatabaseContextTest() 
{ 
    using (var ctx = new InventoryContext(_connectionString)) 
    { 
     //var db = ctx.Database; 
     ctx.InventoryObjects.Add(_inventoryObject); // exception here 
     ctx.SaveChanges(); 
    } 
} 

Es sagt

Failed to set Database.DefaultConnectionFactory to an instance of the 'Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' type as specified in the application configuration. See inner exception for details. 

Innere Ausnahme ist InvalidOperationException:

{"Constructor for type \"Npgsql.NpgsqlFactory\" is not found."} 

Ich denke, es ein Problem mit Verbindungszeichenfolge ist (es enthält Npgsql Anbieter nicht):

"Server=127.0.0.1;Port=5432;User Id=postgres;Password=p4ssw0rd;Database=InventoryDatabase;"; 

Was ist die eleganteste Möglichkeit, dieses Problem programmatisch zu lösen? Habe gerade versucht, connectionString von app.config zu Context Constructor zu übergeben, es funktioniert.
bearbeiten
Uploaded Testprojekt zu Dropbox - VS2012 solution, 10 mb

+0

Hallo! Diese letzte .1 im nugget-Paket ist, weil ich das 2.0.12-Paket nicht aktualisieren konnte. Es gab eine fehlende Datei im Paket und ich musste es aktualisieren. Aber seien Sie versichert, dass die Binärdatei Npgsql die Version 2.0.12 ist. :) Würde es Ihnen etwas ausmachen, mir dieses Beispielprojekt zu schicken, damit ich es mir anschauen kann? Ich denke, dass dies ein Fehler in Npgsql sein kann, der einen Konstruktor EF erwartet, der fehlt. Meine E-Mail-Adresse ist francisco at npgsql dor org. Danke im Voraus. –

+0

Version ist kein Problem, obwohl ich etwas Zeit verloren habe herauszufinden, warum Assembly während der Laufzeit nicht gefunden wurde. Der Punkt ist wirklich in Verbindung String-Konfiguration, vor allem in der Tatsache, in meiner Produktionsumgebung kann ich nicht verwenden/ändern. Config-Dateien (WPF XBAP-Anwendung in IIS Einschränkungen veröffentlicht). Schickt Ihnen ein Beispielprojekt in wenigen Stunden. – Jaded

+0

Gesendet Beispielprojekt, hinzugefügt Dropbox Download Link, wenn jemand anderes suchen möchte. – Jaded

Antwort

7

Dug tiefer in das Problem, fand heraus, dass es durch diese Tatsache verursacht wird, dass Npgsql EntityFramework 4.4.0 Montage verweist. Gelöst wie folgt:

  1. EF Nuget Paket zum Testprojekt hinzugefügt (das gegen FW 4.5 gebaut wird);
  2. Manuell hinzugefügt Verweis auf EntityFramework.dll Version 5 in Npgsql2010-Projekt (Nuget fügt 4.4.0 standardmäßig);
  3. Montage Changed in Npgsql app.config zu "EntityFramework, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089" Bindung; Kann nicht gegossene NpgsqlFactory IDbConnectionFactory ‚ durch Umsetzung IDbConnectionFactory Schnittstelle;
  4. oben „Konstruktor für Typ ‚Npgsql.NpgsqlFactory beschriebenen festen‘
  5. Fest folgende Fehler indem Konstruktor public nicht Fehler nicht gefunden‘ auf NpgsqlFactory:

    mit System.Data.Entity.Infrastructure;
    ...
    public sealed class NpgsqlFactory: DbProviderFactory, IServiceProvider, IDbConnectionFactory
    ...
    öffentliche DbConnection Create (string nameOrConnectionString)
    {
    return neue NpgsqlConnection (nameOrConnectionString);
    }
    d

Jetzt erlebe ich "Fehler: 3F000: Schema "dbo" existiert nicht", was zu EF zusammenhängt. Ich habe Zuordnung zu PostgreSQL Standard öffentlichen Schema in DbContext OnModelCreating: modelBuilder.Entity(). ToTable ("TableName", "public") obwohl. Ich freue mich auf die Lösung dieses Problems.

+0

Großartig! Ich füge sofort die fehlenden Teile hinzu: Sichtbarkeit des Konstruktors und Implementierung der Schnittstelle. Danke, dass du das überprüft hast. –

+1

Ich glaube ich bin zu schnell gesprungen. Beim Überprüfen der msdn-Dokumentation habe ich festgestellt, dass SqlClientFactory eine Sache und SqlConnectionFactory eine andere Sache ist. NpgsqlFactory ist das Äquivalent zu SqlClientFactory. Um dieses Problem zu lösen, müssen wir eine weitere Klasse mit dem Namen NpgsqlConnectionFactory erstellen, die an die Entity Framework-Unterstützung gebunden ist. Das tut mir leid. Ich werde prüfen, wie wir das machen werden. –

+0

Ich habe die Verwendung von EntityFramework mit PostgreSQL und Npgsql aufgegeben diese Probleme sind behoben. Auf keinen Fall gehe ich damit in Produktion, bis es stabiler ist. – Jammer

Verwandte Themen