L'applicazione:
Questa domanda riguarda l'attributo ProviderManifestToken
del file edmx generato automaticamente.
A seconda della versione del database utilizzata (diversi sviluppatori hanno versioni diverse del database) per aggiornare il modello dal database, il valore dell'attributo ProviderManifestToken
viene impostato su 2008 o 2012. Fino a quando non è stato interrotto il supporto per SQL Server 2005, abbiamo fatto in modo che il valore di questo attributo rimanesse nel 2005 (vedi questo articolo SO per maggiori informazioni).
Mi chiedo se ci siano preoccupazioni simili tra il 2008 e il 2012. Che cosa fa veramente questo attributo? È sicuro per me lasciarlo in entrambi i valori senza causare problemi in fase di esecuzione? O dovrei assicurarmi che sia sempre impostato sul 2008 o impostato sempre sul 2012 per assicurarci che l'applicazione funzioni bene con le versioni del database che supportiamo?
MSDN non è molto utile nel descrivere questa proprietà. Dichiara che ProviderManifestToken
è
Una stringa che identifica la versione del server di database utilizzata. Ad esempio, il provider SQL Server utilizza la stringa "2008" per SQL Server 2008. Questo non può essere nullo ma potrebbe essere vuoto.
Grazie!
Dal momento che EF 6.1.2, avendo 2012
come valore ProviderManifestToken
, EF genererà SQL utilizzando offset ... fetch ...
sintassi offset ... fetch ...
(non supportata in MS Sql 2008) in un gruppo di casi, come il paging. Quindi, se lasci che venga modificato nel 2012
, molto probabilmente avrai problemi con le app in esecuzione su MS Sql 2008.
Impostarlo sul 2008
per l'esecuzione sul server Sql più recente dovrebbe essere al sicuro per ora: le funzionalità deprecate di solito non vengono rilasciate fino a v + 2 (dove v è la prima versione in cui sono state deprecate). Spiacente, non sono più in grado di trovare un riferimento per questa affermazione.
Se è necessario che corrisponda al DB di destinazione per ciascuna delle distribuzioni, questa altra risposta SO può essere di aiuto.
Se si desidera impostarlo come 2008
in qualsiasi caso, assicurarsi che i DB di sviluppo siano tutti impostati su 100
(SQL Server 2008) livello di compatibilità dovrebbe fare il trucco. Sfortunatamente sembra che il progettista EF non rispetti sempre il livello di compatibilità del database su cui viene eseguito l'aggiornamento del modello. Quindi, quando lo usa, può "aggiornare" il valore ProviderManifestToken
, causando problemi se il dev lo esegue e lo lascia distribuire.
Non ero in grado di riprodurlo sulla mia workstation. Ma alcuni sviluppatori della mia azienda hanno avuto il problema, anche se affermano che il loro db locale è in 100
livelli di compatibilità.
Sembra che non stessero impostando correttamente l'opzione di script predefinita di SQL Server Management Studio (SSMS). ( Tools
=> Options...
=> SQL Server Object Explorer
=> Scripting
=> Script for server version
). Nel caso in cui, ho fatto loro cambiare, e per ora non riportano più avendo l'indesiderato aggiornamento del valore ProviderManifestToken
.
Questo mi sembra abbastanza strano, poiché le opzioni SSMS non dovrebbero avere alcun impatto sul progettista EF. Solo il database su cui viene eseguito il designer deve essere preso in considerazione IMHO. E come ho già detto, non ero in grado di riprodurre da solo questo problema, nemmeno modificando questa opzione.
Ho risolto questo problema installando Entity Framework 6 Tools per Visual Studio 2012, l'ho scaricato da qui:
https://www.microsoft.com/en-us/download/details.aspx?id=40762
Spero che questo ti aiuti ...