Gli oggetti da Linq a sql sono serializzabili per lo stato della sessione?
-
10-07-2019 - |
Domanda
Senza capire se questa è una buona o una cattiva idea:
È possibile archiviare un oggetto dominio LINQ-to-SQL nella sessione ASP.NET, quando la sessione è fuori processo ?
[EDIT] Attualmente sto ricevendo il seguente errore e ho posto questa domanda perché sospetto gli oggetti LINQ-to-SQL:
Impossibile serializzare lo stato della sessione. In modalità "StateServer" e "SQLServer", ASP.NET serializzerà gli oggetti stato sessione e di conseguenza non sono consentiti oggetti non serializzabili o oggetti MarshalByRef. La stessa restrizione si applica se la serializzazione simile viene eseguita dall'archivio stato sessione personalizzato in modalità "Personalizzata". [/ EDIT]
per es.
Session["Zoo"] = new Zoo() {
new Lion(),
new Tiger(),
new Elephant()
}
dove:
- Zoo, Lion, Tiger, Elephant escono tutti da ZooDataContext
e il file web.config contiene
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
sqlConnectionString="SqlStateConnectionString"
sqlCommandTimeout="30"
timeout="20"
regenerateExpiredSessionId="true"/>
Soluzione
Serializzali utilizzando il datacontractserializer prima di archiviarli in sessione o qualsiasi altra cosa che potrebbe voler serializzare ... Recentemente discusso qui :
Altri suggerimenti
Per usare il formattatore binario (come credo SessionState, credo), dovresti generare tu stesso il tuo codice dal DBML (lo faccio attualmente con un modello Linq2Sql T4).
È necessario contrassegnare come [Non serializzato]
:
-
EntityRef
-
EntitySet
- Tutti gli eventi (per fare ciò, dovrai pensare fuori dagli schemi, allenarti per il lettore)
Anche la logica del costruttore deve essere spostata su OnCreated
. Devi anche assicurarti che OnCreated
venga chiamato durante la deserializzazione in modo che l'oggetto possa tornare utile. Viene eseguito con l'attributo [OnDeserializing]
.
Credo che dovresti contrassegnare i tuoi oggetti come serializzabili. Non sono sicuro che ci sia un modo per farlo per tutti gli oggetti generati, ma per quelli che stai mettendo in sessione, potresti creare una classe parziale (ad es. Di Lion) e assegnarle l'attributo Serializable.