Npgsql con Entity Framework

Dall'ultima versione, Npgsql2 , il .NET Data Provider per PostgreSQL , offre il supporto per Entity Framework.

Purtroppo non è ancora integrato con Visual Studio, quindi per utilizzarlo occorre eseguire direttamente edmgen.exe da linea di comando.

Ma partiamo dal principio, perchè prima di poter ottenere il nostro bel file .edmx, è necessario effettuare alcune operazioni.

  • scaricare l'ultima versione di Npgsql2, la 2.0.1 (non la 2.0.0 che aveva un piccolo problema nel reverse engineering degli schemi) per il framework 3.5 SP1, da qui;
  • estrarre i due assembly Mono.Security.dll e Npgsql.dll dove desiderate;
  • aprire il Visual Studio Command Prompt (run as Administrator se usate Vista!), posizionarsi nella cartella dove avete estratto i files, e registrarli nella GAC ( gacutil /i Mono.Security.dll | gacutil /i Npgsql.dll );
  • sempre dal Visual Studio Command Prompt (non più necessariamente come Administrator se usate Vista!) eseguire edmgen.exe per creare i files .csdl|.ssdl|.msl
    ( edmgen /provider:Npgsql /mode:fullgeneration /c:"Port=5432;Encoding=UNICODE;Server=pgsrv;
    Database=mydb;UserId=dbuser;Password=dbuser!8" /project:MyProject );
  • a questo punto vi troverete i 3 files nella cartella, per concludere l'opera, o meglio per semplificare il tutto, perchè così già si potrebbe procedere, utilizziamo l'utility edmgen2.exe (la trovate qui) per "condensare" i nostri 3 files in un unico .edmx ( edmgen2 /ToEdmx MyProject.csdl MyProject.msl MyProject.ssdl );
  • non ci resta che aggiungere il risultato dei nostri sforzi (il file .edmx) al nostro progetto Visual Studio ( che provvederà ad aggiungere i riferimenti necessari), aggiungere un file di configurazione con la connection string (o specificarla direttamente nel costruttore del context) ed il gioco è fatto;

Attenzione a specificare correttamente il path dei metadati nella stringa di connessione, altrimenti a runtime non li troverà e vi richiederà il path dei file .csdl|.ssdl|.msl; nel mio esempio dovrebbe essere circa così:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:   <connectionStrings>
   4:     <add name="ASTRIMSWContext"
   5:          connectionString="metadata=res://*/MyProject.csdl|res://*/MyProject.ssdl|res://*/MyProject.msl;
   6:          provider=Npgsql;provider connection string='Server=localhost;
   7:          Database=mydb;Integrated Security=False;User ID=mydbuser;Password=mydbuser!8;'" 
   8:          providerName="System.Data.EntityClient" />
   9:   </connectionStrings>
  10: </configuration>

 

posted @ mercoledì 5 novembre 2008 16.52

Print

Comments on this entry:

# re: Npgsql con Entity Framework

Left by Luca at 14/09/2009 11.16
Gravatar
Ciao Luca.
Ho deciso di sviluppare un'applicazione MVC con Visual Web Developer 2008 Express Edition usando come database Postgresql.
Per questo mi sono interessato al tuo post.
La mia situazione.
Ho installato sulla mia macchina anche visul studio 2003.
Ho registrato nella gac i file Npgsql e Mono.Security
Quando vado a creare l'entity mi dice che non riesce a trovare e caricare il provider dati .NET framework registrato.
Mi sono chiesto se la gac e comune alle versioni oppure no.
Hai qualche suggerimento?
Nella versione Express non esiste la gac?
Grazie:)

# re: Npgsql con Entity Framework

Left by Luca at 14/09/2009 11.23
Gravatar
Probabilmente manca l'entry nel machine.config (C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG), prova a verificarlo, dovresti avere una sezione DbProviderFactories tipo quella in coda, dove ovviamente il PublicKeyToken e la Version dipendono dalla versione di Npgsql.dll che hai scaricato


HTH

<system.data>
<DbProviderFactories>
<add name="Odbc Data Provider" invariant="System.Data.Odbc" description=".Net Framework Data Provider for Odbc" type="System.Data.Odbc.OdbcFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add name="OleDb Data Provider" invariant="System.Data.OleDb" description=".Net Framework Data Provider for OleDb" type="System.Data.OleDb.OleDbFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add name="OracleClient Data Provider" invariant="System.Data.OracleClient" description=".Net Framework Data Provider for Oracle" type="System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add name="SqlClient Data Provider" invariant="System.Data.SqlClient" description=".Net Framework Data Provider for SqlServer" type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add name="Npgsql" invariant="Npgsql" description=".NET Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.5.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
<add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/></DbProviderFactories>
</system.data>

Your comment:



 (will not be displayed)


 
 
 
Please add 1 and 7 and type the answer here:
 

Live Comment Preview:

 
«febbraio»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910