Ho colpito la stessa identica situazione di recente. Le migrazioni del mio codice EF spesso introducono una nuova tabella o colonna, e poi metto anche le migrazioni dei dati usando Sql (...) nelle migrazioni che a volte vogliono fare riferimento alla nuova tabella/colonna. Come hai sottolineato, quando viene eseguito come una migrazione del codice EF, ogni istruzione sembra essere emessa come batch discreto per il DB e quindi non ci sono problemi. Tuttavia, per soddisfare i vincoli di implementazione della produzione, trasformiamo un set di migrazioni di codice da uno sprint in un singolo script (utilizzando -Script) per presentare una migrazione di script SQL aggregata singola per il team di distribuzione. Questo file di script a volte non riesce, come hai sottolineato, a causa del tentativo di elaborare un singolo batch T SQL da una migrazione di un singolo codice in cui le istruzioni successive tentano di fare riferimento a una struttura definita solo in precedenza nel batch.
non mi piace particolarmente uno dei due approcci che ho preso per ora per attenuare questo, ma qui sono:
a. Se mi capita di pensarci al momento, ho diviso la migrazione del codice in due migrazioni, in modo che quando sono script, siano in due (o più) lotti separati. Non mi piace perché non ci sono feedback durante lo sviluppo della migrazione del codice che è necessario, e quindi sembra incline all'errore.
b. Quando genero gli script aggregati, li eseguo su un DB scratch per provarli, e finisco per iniettare manualmente le istruzioni "GO" laddove necessario in quello script. Questo è un processo fastidioso da dover tornare indietro e fare, e genera risultati in -Script che non riflettono al 100% le migrazioni del codice.
Non ho speso molto tempo a scavare nel codice sorgente delle migrazioni di codice EF ancora per vedere se riesco a capire perché interpreta "GO" come un processo memorizzato, e se c'è qualcosa nel codice sorgente che potrebbe puntare un modo per fornire una direttiva che eviterebbe questo.
fonte
2012-09-19 12:51:17
Perché hai bisogno di GO? Non è un'istruzione SQL, è un comando per gli strumenti SQL. –
@LadislavMrnka - Ho definito un caso d'uso perfettamente plausibile (ed è associato a problemi) in questa domanda: http://stackoverflow.com/q/13589986/476786 – bPratik