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
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. –
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
Gesendet Beispielprojekt, hinzugefügt Dropbox Download Link, wenn jemand anderes suchen möchte. – Jaded