Come creare una vista usando POCO con codice EF prima

Così semplice Devo creare una vista usando prima il codice. Non ho trovato nulla su questo su google né così via. C’è un modo per realizzare questo?

Ho bisogno che quella vista venga creata e interrogata usando linq, quindi non è una soluzione per crearlo usando uno script sulla creazione del Database, ad esempio:

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

Anche una soluzione è accettabile. Ho bisogno di un modo per interrogare le quadro contro valori non costanti / non quadro.

Non è ansible creare viste con il primo approccio al codice EF. Se si desidera creare la vista, eseguire lo script sql di creazione nel metodo Seed . Ma non sarai ancora in grado di mappare quadro 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:

  • In che modo mappa oggetti per una vista con il codice EF 4 prima?
  • Come definire una vista del database utilizzando Entity Framework 4 Code-First?

è necessario creare manualmente la vista, proprio come ha dichiarato AnatoliiG. ( Aggiunta dell’indice a una tabella ).

Aggiungi il nome della vista come attributo alla tua class

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

È ansible creare una migrazione vuota specificando l’attributo -IgnoreChanges alla fine

 Add-Migration MigrationName -IgnoreChanges 

Questo ti dà uno script di migrazione vuoto che puoi modificare manualmente.

Puoi usare il tuo contesto db per eseguire il tuo codice nello 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"); } } 

Solo un colpo di testa, in EF 6.1 (non sicuro se in precedenza o no) c’è ora un’opzione Code First from Database che è ansible utilizzare e verrà mappata anche alle visualizzazioni.

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 effettivamente utilizza il database. Per usarlo Add a New file to your project -> Data -> ADO.NET Entity Data Model

Quindi seleziona l’opzione Code First From Database e seleziona le tue visualizzazioni (e altre tabelle se lo desideri)

Lo creerà come una mapping di tavolo come Fred stava parlando nella sua risposta, ma farà tutto il codice per te che è bello. Probabilmente vorrai cambiare gli indici e l’ordine.

Quindi chiama semplicemente Sql(@"YOUR VIEW CREATE SQL HERE") nel tuo Up e aggiungi un Sql(@"DROP STATEMENT HERE") nel tuo Down

Un sacco di buone intuizioni dal thread ufficiale di EF7 :

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

Una proprietà

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

B) Metodo di estensione

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

2) Apparentemente, puoi fare in modo che il processo di migrazione ignori determinati dbset

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

(Tutti i precedenti non sono testati)

Non è ansible creare una vista dal codice EF Innanzitutto, è necessario aggiungere lo script nello script “seed” per popolare la visualizzazione.