2015-04-27 8 views
6

Sto provando a utilizzare il primo metodo di entità framework per connettersi al database PostgreSQL e quando uso la procedura guidata del modello di dati dell'entità in Visual Studio per generare la classe C# dal database, può generare correttamente classi per ogni tabella nel database, ma non è possibile generare le viste nel database. Entity Data Model Wizard http://linearbench.com:9000/lbstest/ef.png C# class generated http://linearbench.com:9000/lbstest/code.pngImpossibile generare la classe C# dalla vista di PostgreSQL utilizzando Npgsql + Codice EF6 prima

Può qualcuno mi ha detto dove ho sbagliato? Uso Entity framework 6.1.3, con Npgsql 2.2.5. Il database PosgreSQL è la versione 9.3.6 installata su un server Ubuntu.

Grazie

+1

Questo non è il codice prima – VMAtm

+1

Ciao VMAtm, si prega di consulenza, ho fatto scegliere "Codice prima dal database" in guidata Modello entità dati. – TerryLi

risposta

0

So che questa domanda è un po 'vecchio, ma mal carillon qui per chiunque altro che possono essere alla ricerca di soluzioni qui. La mia risposta potrebbe non essere esattamente ciò che la domanda stava cercando, tuttavia, è stata sufficiente per risolvere il problema.

Il problema con le viste è che il framework di entità ha difficoltà a determinare la colonna della chiave primaria per loro. In Sql Server, è possibile utilizzare la funzione ISNULL() per ingannare EF nel pensare che la colonna sia una colonna chiave, ma la funzione di equallesi coalescenza() in postgres non è sufficiente per EF. Ho anche provato a generare colonne di id di riga autoincrementanti, unirmi ad altre tabelle con chiavi primarie, ecc; nessuna fortuna con nessuno di questi.

Tuttavia, qualcosa che ha appena emulato la funzionalità di cui avevo bisogno per poter interrogare le mie viste nei miei oggetti di visualizzazione è semplicemente estendere la classe di contesto con funzioni che chiamano Database.SqlQuery e restituirle come Queryable

Ad esempio:

Supponiamo una vista nel database, "foo", con le colonne id, bar, baz. È possibile scrivere il proprio POCO per contenere i dati della vista in questo modo

public class foo 
{ 
    public int id { get; set; } 
    public string bar { get; set; } 
    public string baz { get; set; } 
} 

e quindi estendere la classe del contesto con una definizione parziale classe come questa

public partial class FooContext : DbContext 
{ 
    public IQueryable<foo> foo => 
     this.Database.SqlQuery<foo>("select * from foo").AsQueryable(); 
} 

E poi si può interrogare dal proprio contesto solo la stessa di qualsiasi altra tabella

context.foo.where(x => id > 100).toList(); //etc,etc 

È solito essere in grado di fare gli inserti o di utilizzare una di queste funzionalità aggiuntive che vengono solitamente con lo standard DbSet, ma viste sono tipicamente usato comunque come query di sola lettura (a meno che tu non usi alcuni trigger di inserimento speciali) ...

Ma questo ti dà una chiamata base che interrogherà l'intera vista, e non colpirà il database perché è lasciata come interrogabile, quindi sei libero di chiamare qualsiasi altra estensione LINQ su di esso, ad esempio Dove filtrare i risultati desiderati.

Ho eseguito la migrazione da sql server a postgres sql utilizzando lib di npgsql e questa correzione ha consentito alle mie viste di funzionare senza dover apportare alcuna modifica al mio codebase dei programmi, proprio come se nulla fosse cambiato e nonostante il fatto che il edmx non genererebbe i miei oggetti vista a causa della mancanza di una chiave primaria (discernibile).

Spero che questo aiuti!

Problemi correlati