Ho bisogno di mappare a una vista quando si utilizza EF6 con le migrazioni.
La vista pivot 2 altre tabelle per consentire una semplice visualizzazione di riepilogo dei dati sottostanti, l'idea è che ci permette di utilizzare questo in una visualizzazione indice sommario.
Il problema che ho è che non riesco a creare una migrazione che distribuisce la vista (obiettivo ideale) o distribuisce il DB senza la vista per la successiva distribuzione manuale.
Nella maggior parte dei tentativi, in seguito ad altre domande su SO, finisco con il deadlock dei comandi Add-Migration
e Update-Database
o, in genere, causando un errore che interrompe l'uno o l'altro.
Qual è il modo migliore per utilizzare EF6 per accedere alle viste, anche se perdo la possibilità di distribuirle automaticamente con le migrazioni e non causare errori nelle migrazioni.
Il Db contiene 2 tabelle Report e ReportAnswers. La vista ReportView combina questi due elementi e pivot di ReportAnswers per consentire ad alcune delle righe di diventare colonne in questa vista di riepilogo.
Rapporti e rapporti Le risposte sono state depurate tramite Migrazioni EF. La vista è attualmente uno script che deve essere aggiunto alla distribuzione in qualche modo.
Report, ReportAnswers e ReportView sono accessibili dal contesto db
public virtual DbSet<ReportAnswer> ReportAnswers { get; set; }
public virtual DbSet<Report> Reports { get; set; }
public virtual DbSet<ReportView> ReportView { get; set; }
Ho provato ad utilizzare Add-Migration Name -IgnoreChanges
per creare una migrazione vuota e quindi aggiungere manualmente la vista ai metodi Up()
e Down()
ma questo limita i comandi di migrazione e aggiornamento, ciascuno dei quali desidera che l'altro venga eseguito per primo.
Ho anche provato a usare modelBuilder.Ignore<ReportView>();
ignorare il tipo durante l'esecuzione delle migrazioni, ma questo si è dimostrato incredibilmente incline agli errori, anche se sembra funzionare almeno una volta.
Ho appena girato un interessante articolo sull'utilizzo delle viste con EF Core pochi giorni fa, ma ho trovato anche lo stesso usando EF 6.
Si consiglia di utilizzare il metodo Seed
anziché i metodi Up
e Down
della migrazione.
protected override void Seed({DbContextType} context)
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
var baseDir = Path.GetDirectoryName(path) + "\\Migrations\\{CreateViewSQLScriptFilename}.sql";
context.Database.ExecuteSqlCommand(File.ReadAllText(baseDir));
}
Il tuo comando SQL dovrebbe apparire come un esempio qui sotto.
IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[{ViewName}]'))
EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[{ViewName}]
AS
SELECT {SelectCommand}
Non è perfetto, ma spero almeno utile.
Ho trovato un altro post su questo argomento e lo scrittore dice di usare Sql(@"CREATE VIEW dbo.{ViewName} AS...")
nel metodo Up
e Sql(@"DROP VIEW dbo.{ViewName};")
in Down
metodo. L'ho aggiunto perché non hai fornito il codice dai metodi di migrazione Up
e Down
. Forse la buona idea sarà aggiungere SqlFile invece del metodo Sql.
C'è anche la possibilità di creare codice personalizzato o generatore sql e collegarlo alle migrazioni, ma suppongo che non siano le cose che stai cercando.
Fammi sapere nel commento nel caso tu abbia bisogno di ulteriore aiuto.
Link correlati:
Utilizzare prima le viste con il codice di Entity Framework
CODICE EF PRIMA VISTA E PROCEDURE MEMORIZZATE
Utilizzo delle viste in Entity Framework