37 messaggi dal 19 settembre 2010
Rieccomi con il problema dolente . Come detto il tutto funzionava con vs 2010 e ef5 ora ho vs2012 ef 6. Premesso che il database nella string di connessione viene regolarmente sostituito con l'istruzione:

Dim Context = DirectCast(HttpContext.Current.Items("DatabaseEntities"), DatabaseEntities)

nel context infatti compare il database sostituito, ma quando vado a leggere li record mi riporta quelli del database originale nel webconfig.


Spero di essere stato chiaro . Buona serata a tutti
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non so se ho capito bene, puoi chiarire cosa intendi quando dici che il database viene "sostituito"?

Questa istruzione:
Dim Context = DirectCast(HttpContext.Current.Items("DatabaseEntities"), DatabaseEntities)

Serve solo a recuperare il DbContext che avevi in precedenza inserito nella collezione Items. Non influenzerà in alcun modo il database da cui il DbContext andrà a leggere i dati.

Il database puoi sceglierlo nel momento in cui istanzi il DbContext. Se predisponi un costruttore che accetta una stringa, hai l'opportunità di indicare esplicitamente una connection string diversa da quella che è nel web.config.

Ecco un esempio di costruttore che dovresti creare nel tuo DatabaseEntities e che rimappa sul costruttore base di DbContext.
Public Sub New(ByVal connString As String)
        MyBase.New(connString)
End Sub

Puoi usarlo subito prima di inserire l'istanza di DatabaseEntities nella collezione Items.
Dim istanza As New DatabaseEntities("Server=IndirizzoIP; Database=NomeDb; ...");
'E qui aggiungi l'istanza ad Items


Ciao,
Moreno

Enjoy learning and just keep making
37 messaggi dal 19 settembre 2010
Grazie per la tua gentilezza e disponibilita'. Mi sono spiegato male... Mi riferivo alla classe che 2 anni fa mi hai aiutato a costruire per cambiare il database senza modificare direttamente il web.config. Praticamente leggo un db con tutti gli user al suo interno ogni user ha uno specifico db.
Mi hai fatto aggiungere nel web.config
<system.webServer>
<modules>
<add name="getioneCicloDiVitaDelContesto" type="WebContextModule" />
</modules>
</system.webServer>

e mi hai praticamente scritto ..... il modulo webcontextmodule il quale cambia la connectoin string con il nome del database dell'utente prelevandolo da una session.
Ad ogni lettura/scrittura del db bastava:
Dim contesto = DirectCast(HttpContext.Current.Items("DatabaseEntities"), DatabaseEntities)

e scrivere la query. Tutto ok ha sempre funzionato correttamente.
Giorni fa ho ripreso il tutto ma con vs2012 e ef 5 ,prima funzionava con vs2010 e ef 5 ora non piu, o meglio sebbene la webtextmodule faccia il suo lavoro e la connection string venga modificata in memoria quando vado a leggere il db mi da i record di quello di default.
Spulciando ho notato che non occorre piu' imports datatabasemodel necessario invece precedentemete e che nel edmx la strategia generazione codice era impostata come predefinito ora a nessuno. Allora ho provato a generare l'edmx strategia generazione in predefinito , inserito l'imports databasemodel ma a questo punto alla pòrima lettura mi da errore struttura modello. Se ti puo' essewre di aiuto per capire quando inserisco f9 break sulla riga Dim contesto = DirectCast(HttpContext.Current.Items("DatabaseEntities"), DatabaseEntities) prima della lettura e posiziono il mouse sul contesto la connection string e correttamente avvalorata con il databse corretto mentr l'internal connection e' quella del web.config. Ho provato anche cosi'
Dim connString = ConfigurationManager.ConnectionStrings("DatabaseEntities").ConnectionString
connString = connString.Replace("Database.sdf", Session("Database") + ".sdf")
Dim context As New DatabaseEntities(connString) ma nulla da fare. Nella speranza di essere stato chiaro ti ringrazio anticipatamente
Modificato da pistelli2001 il 24 gennaio 2015 09.42 -
Modificato da pistelli2001 il 24 gennaio 2015 10.36 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, bentrovato!

pistelli2001 ha scritto:

Mi riferivo alla classe che 2 anni fa mi hai aiutato a costruire

Sì, mi ricordo, ora ho riletto l'intera discussione.

L'HttpModule va bene così com'è. Anche il codice che recupera l'oggetto DatabaseEntities dalla collezione Items va bene, non bisogna cambiare nulla.

L'unico intervento devi farlo sul costruttore del DbContext ma arriviamoci per gradi.

Qualche giorno fa avevi segnalato questo problema:

(connstring) "Public sub new troppi argomenti"

Dopodiché hai risolto così:

Generato stub

Nonostante il compilatore non ti desse più errori, questa soluzione è sbagliata perché incompleta. Ti ha condotto alla situazione che hai descritto:

l'internal connection e' quella del web.config


Come ti scrivevo nel post precedente, abbiamo bisogno di creare un altro costruttore per DatabaseEntities che accetti una stringa. Questo costruttore rimapperà sul costruttore base per passargli la stringa che ha ricevuto.

Segui questi passi:
  • Apri il file .edmx e salvalo. Questo servirà a rigenerare il contesto e le classi di entità.
  • Aggiungi una nuova classe al tuo progetto, chiamala magari DatabaseEntities. Ti troverai con un nuovo file chiamato DatabaseEntities.vb
  • Apri quel file .vb, e sostituisci il suo contenuto con questo:
    Partial Public Class DatabaseEntities
        Public Sub New(ByVal connString As String)
            MyBase.New(connString)
        End Sub
    End Class
    

    Rispetto allo stub che avevi creato tu, qui c'è il MyBase.New(connString) che serve a trasportare la connection string modificata al DbContext sottostante.


Il resto del codice rimane invariato. L'HttpModule non va toccato.
Posta eventuali errori che ricevi durante la compilazione.

ciao,
Moreno

Enjoy learning and just keep making
37 messaggi dal 19 settembre 2010
Grazie mille , funziona ....... Buona serata !!!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.