2012-11-27 20 views
23

Semplice. Devo creare un Visualizza utilizzando Code First. Non ho trovato nulla su questo su google né così via. C'è un modo per realizzare questo?Come creare una vista utilizzando il codice EF prima POCO

Ho bisogno che vista da creare e interrogati utilizzando LINQ, quindi non è una soluzione per creare utilizzando uno script sulla creazione di database, ad esempio:

var results = from c in db.Customer 
join v in db.MyView on c.Id equals v.Id 
select c; 

un lavoro in giro è anche accettabile. Ho bisogno di un modo per interrogare le entità contro valori non costanti/non entità.

+1

creare una vista: creare una vista sql, proprio come si codice un'entità e viene tradotto come una tabella su SQL. –

risposta

8

Non è possibile creare viste con il codice EF Primo approccio. Se si desidera creare la vista, eseguire lo script sql di creazione nel metodo Seed. Ma non sarai ancora in grado di mappare entità a questa vista, ad eccezione del modello di hacking creando e eliminando la tabella con lo stesso nome che avrà la tua vista.

Alcuni link utili:

+4

Questa era una risposta priva di immaginazione. Probabilmente sono stati possibili soluzioni alternative nel 2012. Assicurati di guardare le altre risposte. – Todd

46

è necessario creare manualmente la vista, proprio come AnatoliiG dichiarato. (Adding index to a table).

Si aggiunge il nome della vista come un attributo alla classe

[Table("UserDTO")] 
    public class UserDTO 
{ 
    /* Class code here */ 
} 

È possibile creare una migrazione vuota specificando l'attributo -IgnoreChanges alla fine

Add-Migration MigrationName -IgnoreChanges 

Questo vi dà un script di migrazione vuoto che è possibile modificare manualmente.

È possibile utilizzare il contesto db per eseguire il codice nel tuo script di migrazione

public partial class editUserDTO : DbMigration 
{ 
    public override void Up() 
    { 
     string script = 
     @" 
     CREATE VIEW dbo.UserDTO 
     AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName 
     FROM dbo.Users u 
     INNER JOIN dbo.People p ON u.PersonId = p.PersonId"; 
     BloggingContext ctx = new BloggingContext(); 
     ctx.Database.ExecuteSqlCommand(script); 
    } 

    public override void Down() 
    { 
     BloggingContext ctx = new BloggingContext(); 
     ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO"); 
    } 
} 
+8

Non dovremmo usare 'CREATE' solo in' Up() 'e' DROP' solo in 'Down()'? –

+0

hi there ... Tentativo di correggere il codice che ho scritto in questo post, (rimosso ctx.Database.ExecuteSqlCommand (script); dal metodo "Down") ma è stato rifiutato da 3 utenti. – Fred

+0

come mappare il mio server sql esistente al codice EF prima? cercando un buon esempio. grazie –

14

Solo un heads up, in EF 6.1 (non so se in precedenza o meno) v'è ora un'opzione di Code First from Database è possibile usa e mapperà anche alle viste.

Personalmente ho il mio in un progetto spazzatura separato in modo da poter solo prendere il codice che voglio da esso e non influenzare il mio progetto che in realtà utilizza il database. Per usarlo Add a New file to your project -> Data -> ADO.NET Entity Data Model

Quindi selezionare l'opzione Code First From Database e selezionare le vostre opinioni (e di altri tavoli se si vuole)

creerà come una mappatura tabella come Fred stava parlando nella sua risposta, ma farà tutto il codice per te che è bello. Probabilmente vorrai cambiare gli indici e l'ordine.

Poi basta chiamare Sql(@"YOUR VIEW CREATE SQL HERE") nel vostro Up e aggiungere un Sql(@"DROP STATEMENT HERE") nel vostro Down

4

Un sacco di buone intuizioni dalla official issues thread of EF7:

1) Non hai ancora un DbSet, e invece avere una proprietà o metodo di estensione

A) Proprietà

class YourContext 
{ 
    public IQueryable<YourView> YourView 
    { 
     get 
     { 
      return this.Database.SqlQuery<YourView>("select * from dbo.YourView"); 
     } 
    } 
} 

B) Metodo di estensione

static class YourContextExtensions 
{ 
    public static IQueryable<YourView>(this YourContext context) 
    { 
     return context.Database.SqlQuery<YourView>("select * from dbo.YourView"); 
    } 

2) A quanto pare, si può avere il processo di migrazione tenere conto di alcune dbsets

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    if (IsMigration) 
    modelBuilder.Ignore<YourViewTable>(); 
... 
} 

(Tutto quanto sopra sono non testato)

+0

Un punto non funziona 'Impossibile convertire implicitamente il tipo 'Syste.Data.Entity.Infrastructure.DbRawSqlQuery .. a ... ' è necessario modificare IQueryable a IEnumerable – Max

+1

Tack, asqueryable alla fine dopo la funzione sqlquery – Todd

+1

No, don 't catena' AsQueryable' dopo 'SqlQuery'. Questo non ti fornirà un oggetto di query dinamico. Quando si utilizza 'SqlQuery' come suggerito, tutti i record saranno selezionati e caricati in memoria, anche se il codice li filtra con un' Where' o usa 'FirstOrDefault' ... Vedi [questa risposta] (https://stackoverflow.com)/a/28664167/1,185136 millions). –

0

Non è possibile creare un vista dal codice EF Innanzitutto, è necessario aggiungere lo script nello script 'seed' per pre-compilare la vista.

+1

Ciao! Si prega di rivedere la risposta in quanto in realtà non risponde alla domanda dell'OP, ma indica semplicemente che ciò che l'OP vuole fare non può essere fatto. Se hai bisogno di aiuto, consulta [come rispondere] (https://stackoverflow.com/help/how-to-answer) nella sezione di aiuto. – Ortund

+0

Non penso che questo appartenga al metodo seme.La creazione di una vista dovrebbe essere effettuata in una migrazione EF. –

Problemi correlati