2012-07-04 13 views
7

Ho già visto discussioni che parlano dell'uso di Entity Framework e PostgreSQL con istruzioni ufficiali. Queste istruzioni devono eseguire gacutil per ogni installazione che non è così utile per scopi di implementazione.Come utilizzare Entity Framework + PostgreSQL dalla connessione?

Quello che voglio fare qui è passare la connessione PostgreSQL direttamente al costruttore DbContext. Questo è abbastanza per me perché userò CodeFirst senza designer. Questo è quello che faccio:

public class Context : DbContext 
{ 
    Context(System.Data.Common.DbConnection connection) 
     : base(connection, true) 
    { 
    } 

    public static Context CreateContext() 
    { 
     NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=********;Database=xxx;"); 
     conn.Open(); 

     return new Context(conn); 
    } 
} 

Ma usando questo metodo ottengo un NotSupportedException con il messaggio:

Impossibile determinare il nome del provider per la connessione di tipo 'Npgsql.NpgsqlConnection'.

Cosa devo fare?

+0

Sembra funzionare per me – user007

risposta

4

È necessario registrare il provider Npgsql nello app/web.config. Vedere la sezione 3.4 Using Npgsql with ProviderFactory del manuale di Npgsql.

Quando si installa un provider ADO.NET per database (MySQL, PostgreSQL, ecc.), Gli installatori registrano solitamente l'assembly del provider in GAC e aggiungono una voce allo machine.config. Se si desidera eseguire la distribuzione senza installare il provider, è necessario includere una copia dell'assembly del provider (impostare il riferimento all'assembly Npgsql come Copia locale per il progetto) e aggiungere una voce all'applicazione app/web.config nel modo seguente:

<configuration> 
    ... 
    <system.data> 
    <DbProviderFactories> 
     <clear /> 
     <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
    </DbProviderFactories> 
    </system.data> 
    ... 
</configuraiton> 

Assicurarsi che la versione corrisponda esattamente alla versione dell'assembly Npgsql con cui si distribuisce (o semplicemente omettere Version/Culture/PublicKeyToken). Il <Clear /> è lì per evitare conflitti se in esecuzione su una macchina che ha già la voce per Npgsql nel suo machine.config. Senza il chiaro otterresti un'eccezione. Tuttavia, ciò presuppone anche che tu non stia facendo affidamento su altri provider specificati nello machine.config per la tua applicazione.