2009-06-30 11 views
11

Sto utilizzando Entity Framework in un'applicazione Web che utilizza SQL server 2000, 2005 e 2008. Quando creo un nuovo file EDMX utilizzando qualcosa di diverso da 2008 (versione del primo edmx creato) Ricevo error 0172: All SSDL artifacts must target the same provider. The Provider 'MyDatabase' is different from ' MyDatabase ' that was encountered earlier. Sembra che da qualche parte nel codice la connessione sia collegata a un datastore 2008 e quando controlla il file SSDL e vede un valore ProviderManifestToken diverso, genera questo errore. Sono un po 'più che frustrato. È difficile immaginare che EF funzioni solo con una singola versione di Sql Server per applicazione. Sono abbastanza sicuro che ci deve essere un'impostazione o una soluzione alternativa. Qualcuno ha una soluzione per utilizzare diverse versioni di SQL Server e Entity Framework all'interno di una singola applicazione web?Più versioni di SQL Server che utilizzano Entity Framework in una singola applicazione ASP.NET

+0

Un elemento importante da ricordare è che sono nel mezzo di una migrazione da sql 2000 a sql 2008 e ho modificato le stringhe di connessione ed eseguito un "aggiornamento del modello dal database" abbastanza stranamente se modifico tutto il SSDL in usa ProviderManifestToken = "2005" l'app funziona. –

+0

Sto cercando anche una risposta a questo problema. Gli unici risultati di google rilevanti che ho trovato finora non entrano in profondità. – Cogwheel

risposta

24

Sono stato in grado di realizzare questo mettendo ogni edmx in un assembly separato. Poi nella stringa di connessione, sostituire tutti i res://*/... con res://NameOfAssembly/...

posso anche eseguire join tra i due modelli di entità (contrariamente alle affermazioni che ho trovato in altre fonti), ad esempio:

var oneDb = new Entities2000(); 
var otherDb = new Entities2005(); 

var results = from one in oneDb.SomeSet 
       join other in otherDb.OtherSet 
        on one.Property equals other.Property 
       select new { 
        SomeProp = one.SomeProp, 
        OtherProp = other.OtherProp 
       }; 
+0

Vedo dove funzionerebbe. Il problema che stavo osservando era perché non funzionava nel mio ambiente. L'unica soluzione in questo momento era impostare tutti ProviderManifestToken sulla stessa versione. Da allora ho migrato tutti i dbs a MSSQL 2008. Quindi, perché questo potrebbe non rispondere alla mia domanda originale, è una soluzione accettabile. –

+0

Ho avuto lo stesso problema. Poi ho implementato tutto quanto descritto nel suggerimento '@Cogwheel - Matthew Orlando' e funziona perfettamente per entrambi i server sql 2005 e 2008. Nota: avevo creato un nuovo progetto per l'accesso ai dati di SQL 2008 con nome diff e quindi copiato tutto il contenuto dal primo e corretto 'ProviderManifestToken' per la corrispondente versione di sql e quindi sostituita namespace nel secondo progetto - secondo il nuovo nome dell'assembly (non so se fosse necessario). E ora sono felice. – mastak

+0

Qualche idea su come procedere mentre usi il codice per primo? –

5

Questo link mi ha aiutato per risolvere il problema quando c'era una differenza in SQL Server 2005 e 2008. http://kkryczka.wordpress.com/2011/01/03/all-ssdl-artifacts-must-target-the-same-provider-the-providermanifesttoken-2008-is-different-from-2005-that-was-encountered-earlier/

Fare clic con il pulsante destro del mouse sul file .edmx e selezionare Apri con XML Editor. Aprire Entity Framework edmx di file:

Modificare il ProviderManifestToken al 2008:

Sembra proprio un problema noto per Microsoft.

+0

Grazie amico. Ho davvero faticato con questo. Un altro sviluppatore ha continuato ad aggiungere al nostro progetto un diverso previdente. Buon articolo –

+0

Quello che ho trovato nel mio caso era che avevamo 3 progetti in una soluzione, e abbiamo cambiato ProviderManifestToken in uno dei progetti A, e questo non mi permetteva di eseguire il progetto B dalla stessa soluzione. – franklins

+0

Nel mio caso ho dovuto modificare 2008 tot 2012 e nella parte inferiore del file si trova: . Cambialo in False e ha funzionato. – Martin

Problemi correlati