Come posso utilizzare prima la visualizzazione del database nel codice del framework di entità,
Come posso utilizzare prima la visualizzazione del database nel codice del framework di entità,
Risposte:
Se, come me, sei interessato solo a mappare entità provenienti da un altro database (un erp nel mio caso) per metterle in relazione con entità specifiche della tua applicazione, allora puoi usare le viste come usi una tabella (mappare la vista in allo stesso modo!). Ovviamente, se provi ad aggiornare quelle entità, otterrai un'eccezione se la vista non è aggiornabile. La procedura è la stessa del caso delle entità normali (basate su una tabella):
Usa un file FooViewConfiguration per impostare un nome diverso per la vista (usando ToTable ("Foo"); nel costruttore) o per impostare proprietà particolari
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Aggiungi il file FooViewConfiguration al modelBuilder, ad esempio, sovrascrivendo il metodo OnModelCreating del Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
questo è probabilmente più semplice rispetto all'utilizzo della creazione di un file EntityTypeConfiguration
.
Questo potrebbe essere un aggiornamento, ma per usare le viste con il codice EF prima aggiungi semplicemente [Table ("NameOfView")] all'inizio della classe e tutto dovrebbe funzionare correttamente senza dover passare attraverso tutti i cerchi che tutti gli altri stanno attraversando. Inoltre dovrai segnalare una delle colonne come una colonna [chiave]. Ecco il mio codice di esempio di seguito per implementarlo.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SomeProject.Data
{
[Table("SomeView")]
public class SomeView
{
[Key]
public int NameID { get; set; }
public string Name { get; set; }
}
}
Ed ecco come appare il contesto
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Se tutto ciò che desideri è un mucchio di oggetti denormalizzati, potresti semplicemente creare una IQueryable<TDenormolized>
proprietà di sola ricezione pubblica nella tua DbContext
classe.
In get
restituisci un risultato Linq per proiettare i valori de-normoalizzati nei tuoi oggetti de-normalizzati. Questo potrebbe essere meglio che scrivere una vista DB perché stai programmando, non sei limitato usando solo le select
istruzioni. Inoltre è sicuro per il tipo in fase di compilazione.
Fai solo attenzione a non attivare enumerazioni come le ToList()
chiamate, che interromperanno la query differita e potresti finire con il recuperare un milione di record dal database e filtrarli sul tuo server delle applicazioni.
Non so se sia la strada giusta, ma ci ho provato e per me funziona.
So che questa è una vecchia domanda e ci sono molte risposte qui, ma ho costretto a un problema quando uso questa risposta e si è verificato un errore quando utilizzo il comando update-database nella console di Gestione pacchetti:
Esiste già un oggetto denominato "..." nel database.
e utilizzo questi passaggi per risolvere questo problema:
spero che sia d'aiuto.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); In modo che i colleghi possano utilizzarlo anche per aggiornare il proprio database.