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!
Questo non è il codice prima – VMAtm
Ciao VMAtm, si prega di consulenza, ho fatto scegliere "Codice prima dal database" in guidata Modello entità dati. – TerryLi